blob: 6f11cb6e91c280da8ecf126e544edab41a87c9f0 [file] [log] [blame]
Tommid3807da2020-05-22 17:36:36 +02001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Markus Handell06a2bf02021-07-22 15:09:39 +020011#include "modules/video_coding/nack_requester.h"
Tommid3807da2020-05-22 17:36:36 +020012
13#include <algorithm>
14#include <cstdint>
15#include <cstring>
16#include <memory>
17
18#include "system_wrappers/include/clock.h"
Tommid3807da2020-05-22 17:36:36 +020019#include "test/gtest.h"
Tommi63673fe2020-05-27 12:55:38 +020020#include "test/run_loop.h"
Jonas Orelande02f9ee2022-03-25 12:43:14 +010021#include "test/scoped_key_value_config.h"
Tommid3807da2020-05-22 17:36:36 +020022
23namespace webrtc {
Tommi63673fe2020-05-27 12:55:38 +020024// TODO(bugs.webrtc.org/11594): Use the use the GlobalSimulatedTimeController
25// instead of RunLoop. At the moment we mix use of the Clock and the underlying
26// implementation of RunLoop, which is realtime.
Erik Språng609aef32022-07-01 16:46:56 +020027class TestNackRequester : public ::testing::Test,
Markus Handell06a2bf02021-07-22 15:09:39 +020028 public NackSender,
29 public KeyFrameRequestSender {
Tommid3807da2020-05-22 17:36:36 +020030 protected:
Markus Handell06a2bf02021-07-22 15:09:39 +020031 TestNackRequester()
Erik Språng609aef32022-07-01 16:46:56 +020032 : clock_(new SimulatedClock(0)), keyframes_requested_(0) {}
Tommid3807da2020-05-22 17:36:36 +020033
Tommi63673fe2020-05-27 12:55:38 +020034 void SetUp() override {}
Tommid3807da2020-05-22 17:36:36 +020035
36 void SendNack(const std::vector<uint16_t>& sequence_numbers,
37 bool buffering_allowed) override {
38 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
39 sequence_numbers.end());
Tommi63673fe2020-05-27 12:55:38 +020040 if (waiting_for_send_nack_) {
41 waiting_for_send_nack_ = false;
42 loop_.Quit();
43 }
Tommid3807da2020-05-22 17:36:36 +020044 }
45
46 void RequestKeyFrame() override { ++keyframes_requested_; }
47
Tommi63673fe2020-05-27 12:55:38 +020048 void Flush() {
49 // nack_module.Process();
50 loop_.Flush();
51 }
52
53 bool WaitForSendNack() {
54 if (timed_out_) {
Artem Titovd3251962021-11-15 16:57:07 +010055 RTC_DCHECK_NOTREACHED();
Tommi63673fe2020-05-27 12:55:38 +020056 return false;
57 }
58
59 RTC_DCHECK(!waiting_for_send_nack_);
60
61 waiting_for_send_nack_ = true;
Danil Chapovalov0be8eba2022-07-06 13:17:54 +020062 loop_.task_queue()->PostDelayedTask(
Tommi63673fe2020-05-27 12:55:38 +020063 [this]() {
64 timed_out_ = true;
65 loop_.Quit();
66 },
Danil Chapovalov0be8eba2022-07-06 13:17:54 +020067 TimeDelta::Seconds(1));
Tommi63673fe2020-05-27 12:55:38 +020068
69 loop_.Run();
70
71 if (timed_out_)
72 return false;
73
74 RTC_DCHECK(!waiting_for_send_nack_);
75 return true;
76 }
77
Markus Handell06a2bf02021-07-22 15:09:39 +020078 NackRequester& CreateNackModule(
Markus Handell0e62f7a2021-07-20 13:32:02 +020079 TimeDelta interval = NackPeriodicProcessor::kUpdateInterval) {
Tommi63673fe2020-05-27 12:55:38 +020080 RTC_DCHECK(!nack_module_.get());
Markus Handell0e62f7a2021-07-20 13:32:02 +020081 nack_periodic_processor_ =
82 std::make_unique<NackPeriodicProcessor>(interval);
Erik Språng609aef32022-07-01 16:46:56 +020083 test::ScopedKeyValueConfig empty_field_trials_;
Markus Handell06a2bf02021-07-22 15:09:39 +020084 nack_module_ = std::make_unique<NackRequester>(
85 TaskQueueBase::Current(), nack_periodic_processor_.get(), clock_.get(),
Erik Språng609aef32022-07-01 16:46:56 +020086 this, this, empty_field_trials_);
Tommi63673fe2020-05-27 12:55:38 +020087 nack_module_->UpdateRtt(kDefaultRttMs);
88 return *nack_module_.get();
89 }
90
Tommid3807da2020-05-22 17:36:36 +020091 static constexpr int64_t kDefaultRttMs = 20;
Niels Möller83830f32022-05-20 09:12:57 +020092 rtc::AutoThread main_thread_;
Tommi63673fe2020-05-27 12:55:38 +020093 test::RunLoop loop_;
Tommid3807da2020-05-22 17:36:36 +020094 std::unique_ptr<SimulatedClock> clock_;
Markus Handell0e62f7a2021-07-20 13:32:02 +020095 std::unique_ptr<NackPeriodicProcessor> nack_periodic_processor_;
Markus Handell06a2bf02021-07-22 15:09:39 +020096 std::unique_ptr<NackRequester> nack_module_;
Tommid3807da2020-05-22 17:36:36 +020097 std::vector<uint16_t> sent_nacks_;
98 int keyframes_requested_;
Tommi63673fe2020-05-27 12:55:38 +020099 bool waiting_for_send_nack_ = false;
100 bool timed_out_ = false;
Tommid3807da2020-05-22 17:36:36 +0200101};
102
Erik Språng609aef32022-07-01 16:46:56 +0200103TEST_F(TestNackRequester, NackOnePacket) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200104 NackRequester& nack_module = CreateNackModule();
Tommi63673fe2020-05-27 12:55:38 +0200105 nack_module.OnReceivedPacket(1, false, false);
106 nack_module.OnReceivedPacket(3, false, false);
107 ASSERT_EQ(1u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200108 EXPECT_EQ(2, sent_nacks_[0]);
109}
110
Erik Språng609aef32022-07-01 16:46:56 +0200111TEST_F(TestNackRequester, WrappingSeqNum) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200112 NackRequester& nack_module = CreateNackModule();
Tommi63673fe2020-05-27 12:55:38 +0200113 nack_module.OnReceivedPacket(0xfffe, false, false);
114 nack_module.OnReceivedPacket(1, false, false);
115 ASSERT_EQ(2u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200116 EXPECT_EQ(0xffff, sent_nacks_[0]);
117 EXPECT_EQ(0, sent_nacks_[1]);
118}
119
Erik Språng609aef32022-07-01 16:46:56 +0200120TEST_F(TestNackRequester, WrappingSeqNumClearToKeyframe) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200121 NackRequester& nack_module = CreateNackModule(TimeDelta::Millis(10));
Tommi63673fe2020-05-27 12:55:38 +0200122 nack_module.OnReceivedPacket(0xfffe, false, false);
123 nack_module.OnReceivedPacket(1, false, false);
124 ASSERT_EQ(2u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200125 EXPECT_EQ(0xffff, sent_nacks_[0]);
126 EXPECT_EQ(0, sent_nacks_[1]);
127
128 sent_nacks_.clear();
Tommi63673fe2020-05-27 12:55:38 +0200129 nack_module.OnReceivedPacket(2, true, false);
130 ASSERT_EQ(0u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200131
Tommi63673fe2020-05-27 12:55:38 +0200132 nack_module.OnReceivedPacket(501, true, false);
133 ASSERT_EQ(498u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200134 for (int seq_num = 3; seq_num < 501; ++seq_num)
135 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
136
137 sent_nacks_.clear();
Tommi63673fe2020-05-27 12:55:38 +0200138 nack_module.OnReceivedPacket(1001, false, false);
Tommid3807da2020-05-22 17:36:36 +0200139 EXPECT_EQ(499u, sent_nacks_.size());
140 for (int seq_num = 502; seq_num < 1001; ++seq_num)
141 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
142
143 sent_nacks_.clear();
144 clock_->AdvanceTimeMilliseconds(100);
Tommi63673fe2020-05-27 12:55:38 +0200145 ASSERT_TRUE(WaitForSendNack());
146 ASSERT_EQ(999u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200147 EXPECT_EQ(0xffff, sent_nacks_[0]);
148 EXPECT_EQ(0, sent_nacks_[1]);
149 for (int seq_num = 3; seq_num < 501; ++seq_num)
150 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 1]);
151 for (int seq_num = 502; seq_num < 1001; ++seq_num)
152 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 2]);
153
154 // Adding packet 1004 will cause the nack list to reach it's max limit.
155 // It will then clear all nacks up to the next keyframe (seq num 2),
156 // thus removing 0xffff and 0 from the nack list.
157 sent_nacks_.clear();
Tommi63673fe2020-05-27 12:55:38 +0200158 nack_module.OnReceivedPacket(1004, false, false);
159 ASSERT_EQ(2u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200160 EXPECT_EQ(1002, sent_nacks_[0]);
161 EXPECT_EQ(1003, sent_nacks_[1]);
162
163 sent_nacks_.clear();
164 clock_->AdvanceTimeMilliseconds(100);
Tommi63673fe2020-05-27 12:55:38 +0200165 ASSERT_TRUE(WaitForSendNack());
166 ASSERT_EQ(999u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200167 for (int seq_num = 3; seq_num < 501; ++seq_num)
168 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
169 for (int seq_num = 502; seq_num < 1001; ++seq_num)
170 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 4]);
171
172 // Adding packet 1007 will cause the nack module to overflow again, thus
173 // clearing everything up to 501 which is the next keyframe.
Tommi63673fe2020-05-27 12:55:38 +0200174 nack_module.OnReceivedPacket(1007, false, false);
Tommid3807da2020-05-22 17:36:36 +0200175 sent_nacks_.clear();
176 clock_->AdvanceTimeMilliseconds(100);
Tommi63673fe2020-05-27 12:55:38 +0200177 ASSERT_TRUE(WaitForSendNack());
178 ASSERT_EQ(503u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200179 for (int seq_num = 502; seq_num < 1001; ++seq_num)
180 EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
181 EXPECT_EQ(1005, sent_nacks_[501]);
182 EXPECT_EQ(1006, sent_nacks_[502]);
183}
184
Erik Språng609aef32022-07-01 16:46:56 +0200185TEST_F(TestNackRequester, ResendNack) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200186 NackRequester& nack_module = CreateNackModule(TimeDelta::Millis(1));
Tommi63673fe2020-05-27 12:55:38 +0200187 nack_module.OnReceivedPacket(1, false, false);
188 nack_module.OnReceivedPacket(3, false, false);
Tommid3807da2020-05-22 17:36:36 +0200189 size_t expected_nacks_sent = 1;
Tommi63673fe2020-05-27 12:55:38 +0200190 ASSERT_EQ(expected_nacks_sent, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200191 EXPECT_EQ(2, sent_nacks_[0]);
192
Erik Språng609aef32022-07-01 16:46:56 +0200193 nack_module.UpdateRtt(1);
194 clock_->AdvanceTimeMilliseconds(1);
195 WaitForSendNack(); // Fast retransmit allowed.
196 EXPECT_EQ(++expected_nacks_sent, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200197
Erik Språng609aef32022-07-01 16:46:56 +0200198 // Each try has to wait rtt by default.
Tommid3807da2020-05-22 17:36:36 +0200199 for (int i = 2; i < 10; ++i) {
200 // Change RTT, above the 40ms max for exponential backoff.
201 TimeDelta rtt = TimeDelta::Millis(160); // + (i * 10 - 40)
Tommi63673fe2020-05-27 12:55:38 +0200202 nack_module.UpdateRtt(rtt.ms());
Tommid3807da2020-05-22 17:36:36 +0200203
204 // RTT gets capped at 160ms in backoff calculations.
205 TimeDelta expected_backoff_delay =
Erik Språng609aef32022-07-01 16:46:56 +0200206 (i - 1) * std::min(rtt, TimeDelta::Millis(160));
Tommid3807da2020-05-22 17:36:36 +0200207
208 // Move to one millisecond before next allowed NACK.
209 clock_->AdvanceTimeMilliseconds(expected_backoff_delay.ms() - 1);
Tommi63673fe2020-05-27 12:55:38 +0200210 Flush();
Tommid3807da2020-05-22 17:36:36 +0200211 EXPECT_EQ(expected_nacks_sent, sent_nacks_.size());
212
213 // Move to one millisecond after next allowed NACK.
214 // After rather than on to avoid rounding errors.
215 clock_->AdvanceTimeMilliseconds(2);
Tommi63673fe2020-05-27 12:55:38 +0200216 WaitForSendNack(); // Now allowed.
Tommid3807da2020-05-22 17:36:36 +0200217 EXPECT_EQ(++expected_nacks_sent, sent_nacks_.size());
218 }
219
220 // Giving up after 10 tries.
221 clock_->AdvanceTimeMilliseconds(3000);
Tommi63673fe2020-05-27 12:55:38 +0200222 Flush();
Tommid3807da2020-05-22 17:36:36 +0200223 EXPECT_EQ(expected_nacks_sent, sent_nacks_.size());
224}
225
Erik Språng609aef32022-07-01 16:46:56 +0200226TEST_F(TestNackRequester, ResendPacketMaxRetries) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200227 NackRequester& nack_module = CreateNackModule(TimeDelta::Millis(1));
Tommi63673fe2020-05-27 12:55:38 +0200228 nack_module.OnReceivedPacket(1, false, false);
229 nack_module.OnReceivedPacket(3, false, false);
230 ASSERT_EQ(1u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200231 EXPECT_EQ(2, sent_nacks_[0]);
232
233 int backoff_factor = 1;
234 for (size_t retries = 1; retries < 10; ++retries) {
235 // Exponential backoff, so that we don't reject NACK because of time.
236 clock_->AdvanceTimeMilliseconds(backoff_factor * kDefaultRttMs);
237 backoff_factor *= 2;
Tommi63673fe2020-05-27 12:55:38 +0200238 WaitForSendNack();
Tommid3807da2020-05-22 17:36:36 +0200239 EXPECT_EQ(retries + 1, sent_nacks_.size());
240 }
241
242 clock_->AdvanceTimeMilliseconds(backoff_factor * kDefaultRttMs);
Tommi63673fe2020-05-27 12:55:38 +0200243 Flush();
Tommid3807da2020-05-22 17:36:36 +0200244 EXPECT_EQ(10u, sent_nacks_.size());
245}
246
Erik Språng609aef32022-07-01 16:46:56 +0200247TEST_F(TestNackRequester, TooLargeNackList) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200248 NackRequester& nack_module = CreateNackModule();
Tommi63673fe2020-05-27 12:55:38 +0200249 nack_module.OnReceivedPacket(0, false, false);
250 nack_module.OnReceivedPacket(1001, false, false);
Tommid3807da2020-05-22 17:36:36 +0200251 EXPECT_EQ(1000u, sent_nacks_.size());
252 EXPECT_EQ(0, keyframes_requested_);
Tommi63673fe2020-05-27 12:55:38 +0200253 nack_module.OnReceivedPacket(1003, false, false);
Tommid3807da2020-05-22 17:36:36 +0200254 EXPECT_EQ(1000u, sent_nacks_.size());
255 EXPECT_EQ(1, keyframes_requested_);
Tommi63673fe2020-05-27 12:55:38 +0200256 nack_module.OnReceivedPacket(1004, false, false);
Tommid3807da2020-05-22 17:36:36 +0200257 EXPECT_EQ(1000u, sent_nacks_.size());
258 EXPECT_EQ(1, keyframes_requested_);
259}
260
Erik Språng609aef32022-07-01 16:46:56 +0200261TEST_F(TestNackRequester, TooLargeNackListWithKeyFrame) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200262 NackRequester& nack_module = CreateNackModule();
Tommi63673fe2020-05-27 12:55:38 +0200263 nack_module.OnReceivedPacket(0, false, false);
264 nack_module.OnReceivedPacket(1, true, false);
265 nack_module.OnReceivedPacket(1001, false, false);
Tommid3807da2020-05-22 17:36:36 +0200266 EXPECT_EQ(999u, sent_nacks_.size());
267 EXPECT_EQ(0, keyframes_requested_);
Tommi63673fe2020-05-27 12:55:38 +0200268 nack_module.OnReceivedPacket(1003, false, false);
Tommid3807da2020-05-22 17:36:36 +0200269 EXPECT_EQ(1000u, sent_nacks_.size());
270 EXPECT_EQ(0, keyframes_requested_);
Tommi63673fe2020-05-27 12:55:38 +0200271 nack_module.OnReceivedPacket(1005, false, false);
Tommid3807da2020-05-22 17:36:36 +0200272 EXPECT_EQ(1000u, sent_nacks_.size());
273 EXPECT_EQ(1, keyframes_requested_);
274}
275
Erik Språng609aef32022-07-01 16:46:56 +0200276TEST_F(TestNackRequester, ClearUpTo) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200277 NackRequester& nack_module = CreateNackModule(TimeDelta::Millis(1));
Tommi63673fe2020-05-27 12:55:38 +0200278 nack_module.OnReceivedPacket(0, false, false);
279 nack_module.OnReceivedPacket(100, false, false);
Tommid3807da2020-05-22 17:36:36 +0200280 EXPECT_EQ(99u, sent_nacks_.size());
281
282 sent_nacks_.clear();
283 clock_->AdvanceTimeMilliseconds(100);
Tommi63673fe2020-05-27 12:55:38 +0200284 nack_module.ClearUpTo(50);
285 WaitForSendNack();
286 ASSERT_EQ(50u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200287 EXPECT_EQ(50, sent_nacks_[0]);
288}
289
Erik Språng609aef32022-07-01 16:46:56 +0200290TEST_F(TestNackRequester, ClearUpToWrap) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200291 NackRequester& nack_module = CreateNackModule();
Tommi63673fe2020-05-27 12:55:38 +0200292 nack_module.OnReceivedPacket(0xfff0, false, false);
293 nack_module.OnReceivedPacket(0xf, false, false);
Tommid3807da2020-05-22 17:36:36 +0200294 EXPECT_EQ(30u, sent_nacks_.size());
295
296 sent_nacks_.clear();
297 clock_->AdvanceTimeMilliseconds(100);
Tommi63673fe2020-05-27 12:55:38 +0200298 nack_module.ClearUpTo(0);
299 WaitForSendNack();
300 ASSERT_EQ(15u, sent_nacks_.size());
Tommid3807da2020-05-22 17:36:36 +0200301 EXPECT_EQ(0, sent_nacks_[0]);
302}
303
Erik Språng609aef32022-07-01 16:46:56 +0200304TEST_F(TestNackRequester, PacketNackCount) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200305 NackRequester& nack_module = CreateNackModule(TimeDelta::Millis(1));
Tommi63673fe2020-05-27 12:55:38 +0200306 EXPECT_EQ(0, nack_module.OnReceivedPacket(0, false, false));
307 EXPECT_EQ(0, nack_module.OnReceivedPacket(2, false, false));
308 EXPECT_EQ(1, nack_module.OnReceivedPacket(1, false, false));
Tommid3807da2020-05-22 17:36:36 +0200309
310 sent_nacks_.clear();
Tommi63673fe2020-05-27 12:55:38 +0200311 nack_module.UpdateRtt(100);
312 EXPECT_EQ(0, nack_module.OnReceivedPacket(5, false, false));
Tommid3807da2020-05-22 17:36:36 +0200313 clock_->AdvanceTimeMilliseconds(100);
Tommi63673fe2020-05-27 12:55:38 +0200314 WaitForSendNack();
315 EXPECT_EQ(4u, sent_nacks_.size());
316
Tommid3807da2020-05-22 17:36:36 +0200317 clock_->AdvanceTimeMilliseconds(125);
Tommi63673fe2020-05-27 12:55:38 +0200318 WaitForSendNack();
319
320 EXPECT_EQ(6u, sent_nacks_.size());
321
322 EXPECT_EQ(3, nack_module.OnReceivedPacket(3, false, false));
323 EXPECT_EQ(3, nack_module.OnReceivedPacket(4, false, false));
324 EXPECT_EQ(0, nack_module.OnReceivedPacket(4, false, false));
Tommid3807da2020-05-22 17:36:36 +0200325}
326
Erik Språng609aef32022-07-01 16:46:56 +0200327TEST_F(TestNackRequester, NackListFullAndNoOverlapWithKeyframes) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200328 NackRequester& nack_module = CreateNackModule();
Tommid3807da2020-05-22 17:36:36 +0200329 const int kMaxNackPackets = 1000;
330 const unsigned int kFirstGap = kMaxNackPackets - 20;
331 const unsigned int kSecondGap = 200;
332 uint16_t seq_num = 0;
Tommi63673fe2020-05-27 12:55:38 +0200333 nack_module.OnReceivedPacket(seq_num++, true, false);
Tommid3807da2020-05-22 17:36:36 +0200334 seq_num += kFirstGap;
Tommi63673fe2020-05-27 12:55:38 +0200335 nack_module.OnReceivedPacket(seq_num++, true, false);
Tommid3807da2020-05-22 17:36:36 +0200336 EXPECT_EQ(kFirstGap, sent_nacks_.size());
337 sent_nacks_.clear();
338 seq_num += kSecondGap;
Tommi63673fe2020-05-27 12:55:38 +0200339 nack_module.OnReceivedPacket(seq_num, true, false);
Tommid3807da2020-05-22 17:36:36 +0200340 EXPECT_EQ(kSecondGap, sent_nacks_.size());
341}
342
Erik Språng609aef32022-07-01 16:46:56 +0200343TEST_F(TestNackRequester, HandleFecRecoveredPacket) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200344 NackRequester& nack_module = CreateNackModule();
Tommi63673fe2020-05-27 12:55:38 +0200345 nack_module.OnReceivedPacket(1, false, false);
346 nack_module.OnReceivedPacket(4, false, true);
Tommid3807da2020-05-22 17:36:36 +0200347 EXPECT_EQ(0u, sent_nacks_.size());
Tommi63673fe2020-05-27 12:55:38 +0200348 nack_module.OnReceivedPacket(5, false, false);
Tommid3807da2020-05-22 17:36:36 +0200349 EXPECT_EQ(2u, sent_nacks_.size());
350}
351
Erik Språng609aef32022-07-01 16:46:56 +0200352TEST_F(TestNackRequester, SendNackWithoutDelay) {
Markus Handell06a2bf02021-07-22 15:09:39 +0200353 NackRequester& nack_module = CreateNackModule();
Tommi63673fe2020-05-27 12:55:38 +0200354 nack_module.OnReceivedPacket(0, false, false);
355 nack_module.OnReceivedPacket(100, false, false);
Tommid3807da2020-05-22 17:36:36 +0200356 EXPECT_EQ(99u, sent_nacks_.size());
357}
358
Markus Handell06a2bf02021-07-22 15:09:39 +0200359class TestNackRequesterWithFieldTrial : public ::testing::Test,
360 public NackSender,
361 public KeyFrameRequestSender {
Tommid3807da2020-05-22 17:36:36 +0200362 protected:
Markus Handell06a2bf02021-07-22 15:09:39 +0200363 TestNackRequesterWithFieldTrial()
Tommid3807da2020-05-22 17:36:36 +0200364 : nack_delay_field_trial_("WebRTC-SendNackDelayMs/10/"),
365 clock_(new SimulatedClock(0)),
Markus Handell0e62f7a2021-07-20 13:32:02 +0200366 nack_module_(TaskQueueBase::Current(),
367 &nack_periodic_processor_,
368 clock_.get(),
369 this,
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100370 this,
371 nack_delay_field_trial_),
Tommid3807da2020-05-22 17:36:36 +0200372 keyframes_requested_(0) {}
373
374 void SendNack(const std::vector<uint16_t>& sequence_numbers,
375 bool buffering_allowed) override {
376 sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
377 sequence_numbers.end());
378 }
379
380 void RequestKeyFrame() override { ++keyframes_requested_; }
381
Jonas Orelande02f9ee2022-03-25 12:43:14 +0100382 test::ScopedKeyValueConfig nack_delay_field_trial_;
Niels Möller83830f32022-05-20 09:12:57 +0200383 rtc::AutoThread main_thread_;
Tommid3807da2020-05-22 17:36:36 +0200384 std::unique_ptr<SimulatedClock> clock_;
Markus Handell0e62f7a2021-07-20 13:32:02 +0200385 NackPeriodicProcessor nack_periodic_processor_;
Markus Handell06a2bf02021-07-22 15:09:39 +0200386 NackRequester nack_module_;
Tommid3807da2020-05-22 17:36:36 +0200387 std::vector<uint16_t> sent_nacks_;
388 int keyframes_requested_;
389};
390
Markus Handell06a2bf02021-07-22 15:09:39 +0200391TEST_F(TestNackRequesterWithFieldTrial, SendNackWithDelay) {
Tommid3807da2020-05-22 17:36:36 +0200392 nack_module_.OnReceivedPacket(0, false, false);
393 nack_module_.OnReceivedPacket(100, false, false);
394 EXPECT_EQ(0u, sent_nacks_.size());
395 clock_->AdvanceTimeMilliseconds(10);
396 nack_module_.OnReceivedPacket(106, false, false);
397 EXPECT_EQ(99u, sent_nacks_.size());
398 clock_->AdvanceTimeMilliseconds(10);
399 nack_module_.OnReceivedPacket(109, false, false);
400 EXPECT_EQ(104u, sent_nacks_.size());
401}
402} // namespace webrtc