• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2013 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 
11 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
12 
13 #include <numeric>
14 
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "webrtc/base/constructormagic.h"
17 #include "webrtc/modules/remote_bitrate_estimator/test/packet.h"
18 #include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
19 #include "webrtc/test/testsupport/fileutils.h"
20 
21 namespace webrtc {
22 namespace testing {
23 namespace bwe {
24 
IsSequenceNumberSorted(const Packets & packets)25 static bool IsSequenceNumberSorted(const Packets& packets) {
26   PacketsConstIt last_it = packets.begin();
27   for (PacketsConstIt it = last_it; it != packets.end(); ++it) {
28     const MediaPacket* packet = static_cast<const MediaPacket*>(*it);
29     const MediaPacket* last_packet = static_cast<const MediaPacket*>(*last_it);
30     if (IsNewerSequenceNumber(last_packet->header().sequenceNumber,
31                               packet->header().sequenceNumber)) {
32       return false;
33     }
34     last_it = it;
35   }
36   return true;
37 }
38 
TEST(BweTestFramework_PacketTest,IsTimeSorted)39 TEST(BweTestFramework_PacketTest, IsTimeSorted) {
40   Packets packets;
41   // Insert some packets in order...
42   EXPECT_TRUE(IsTimeSorted(packets));
43 
44   packets.push_back(new MediaPacket(100, 0));
45   EXPECT_TRUE(IsTimeSorted(packets));
46 
47   packets.push_back(new MediaPacket(110, 0));
48   EXPECT_TRUE(IsTimeSorted(packets));
49 
50   // ...and one out-of-order...
51   packets.push_back(new MediaPacket(100, 0));
52   EXPECT_FALSE(IsTimeSorted(packets));
53 
54   // ...remove the out-of-order packet, insert another in-order packet.
55   delete packets.back();
56   packets.pop_back();
57   packets.push_back(new MediaPacket(120, 0));
58   EXPECT_TRUE(IsTimeSorted(packets));
59 
60   for (auto* packet : packets)
61     delete packet;
62 }
63 
TEST(BweTestFramework_PacketTest,IsSequenceNumberSorted)64 TEST(BweTestFramework_PacketTest, IsSequenceNumberSorted) {
65   Packets packets;
66   // Insert some packets in order...
67   EXPECT_TRUE(IsSequenceNumberSorted(packets));
68 
69   packets.push_back(new MediaPacket(0, 100));
70   EXPECT_TRUE(IsSequenceNumberSorted(packets));
71 
72   packets.push_back(new MediaPacket(0, 110));
73   EXPECT_TRUE(IsSequenceNumberSorted(packets));
74 
75   // ...and one out-of-order...
76   packets.push_back(new MediaPacket(0, 100));
77   EXPECT_FALSE(IsSequenceNumberSorted(packets));
78 
79   // ...remove the out-of-order packet, insert another in-order packet.
80   delete packets.back();
81   packets.pop_back();
82   packets.push_back(new MediaPacket(0, 120));
83   EXPECT_TRUE(IsSequenceNumberSorted(packets));
84 
85   for (auto* packet : packets)
86     delete packet;
87 }
88 
TEST(BweTestFramework_StatsTest,Mean)89 TEST(BweTestFramework_StatsTest, Mean) {
90   Stats<int32_t> stats;
91   EXPECT_EQ(0, stats.GetMean());
92 
93   stats.Push(1);
94   stats.Push(3);
95   EXPECT_EQ(2, stats.GetMean());
96 
97   // Integer division rounds (1+3-3)/3 to 0.
98   stats.Push(-3);
99   EXPECT_EQ(0, stats.GetMean());
100 }
101 
TEST(BweTestFramework_StatsTest,Variance)102 TEST(BweTestFramework_StatsTest, Variance) {
103   Stats<int32_t> stats;
104   EXPECT_EQ(0, stats.GetVariance());
105 
106   // Mean is 2 ; ((1-2)*(1-2)+(3-2)*(3-2))/2 = (1+1)/2 = 1
107   stats.Push(1);
108   stats.Push(3);
109   EXPECT_EQ(1, stats.GetVariance());
110 
111   // Integer division rounds 26/3 to 8
112   // Mean is 0 ; (1*1+3*3+(-4)*(-4))/3 = (1+9+16)/3 = 8
113   stats.Push(-4);
114   EXPECT_EQ(8, stats.GetVariance());
115 }
116 
TEST(BweTestFramework_StatsTest,StdDev)117 TEST(BweTestFramework_StatsTest, StdDev) {
118   Stats<int32_t> stats;
119   EXPECT_EQ(0, stats.GetStdDev());
120 
121   // Variance is 1 ; sqrt(1) = 1
122   stats.Push(1);
123   stats.Push(3);
124   EXPECT_EQ(1, stats.GetStdDev());
125 
126   // Variance is 8 ; sqrt(8) = 2 with integers.
127   stats.Push(-4);
128   EXPECT_EQ(2, stats.GetStdDev());
129 }
130 
TEST(BweTestFramework_StatsTest,MinMax)131 TEST(BweTestFramework_StatsTest, MinMax) {
132   Stats<int32_t> stats;
133   EXPECT_EQ(0, stats.GetMin());
134   EXPECT_EQ(0, stats.GetMax());
135 
136   stats.Push(1);
137   EXPECT_EQ(1, stats.GetMin());
138   EXPECT_EQ(1, stats.GetMax());
139 
140   stats.Push(3);
141   EXPECT_EQ(1, stats.GetMin());
142   EXPECT_EQ(3, stats.GetMax());
143 
144   stats.Push(-4);
145   EXPECT_EQ(-4, stats.GetMin());
146   EXPECT_EQ(3, stats.GetMax());
147 }
148 
149 class BweTestFramework_RateCounterFilterTest : public ::testing::Test {
150  public:
BweTestFramework_RateCounterFilterTest()151   BweTestFramework_RateCounterFilterTest()
152       : filter_(NULL, 0, "", ""), now_ms_(0) {}
~BweTestFramework_RateCounterFilterTest()153   virtual ~BweTestFramework_RateCounterFilterTest() {}
154 
155  protected:
TestRateCounter(int64_t run_for_ms,uint32_t payload_bits,uint32_t expected_pps,uint32_t expected_bps)156   void TestRateCounter(int64_t run_for_ms, uint32_t payload_bits,
157                        uint32_t expected_pps, uint32_t expected_bps) {
158     Packets packets;
159     RTPHeader header;
160     // "Send" a packet every 10 ms.
161     for (int64_t i = 0; i < run_for_ms; i += 10, now_ms_ += 10) {
162       packets.push_back(
163           new MediaPacket(0, now_ms_ * 1000, payload_bits / 8, header));
164     }
165     filter_.RunFor(run_for_ms, &packets);
166     ASSERT_TRUE(IsTimeSorted(packets));
167     EXPECT_EQ(expected_pps, filter_.packets_per_second());
168     EXPECT_EQ(expected_bps, filter_.bits_per_second());
169 
170     for (auto* packet : packets)
171       delete packet;
172   }
173 
174  private:
175   RateCounterFilter filter_;
176   int64_t now_ms_;
177 
178   RTC_DISALLOW_COPY_AND_ASSIGN(BweTestFramework_RateCounterFilterTest);
179 };
180 
TEST_F(BweTestFramework_RateCounterFilterTest,Short)181 TEST_F(BweTestFramework_RateCounterFilterTest, Short) {
182   // 100ms, 100 bytes per packet, should result in 10 pps and 8 kbps. We're
183   // generating one packet every 10 ms ; 10 * 800 = 8k
184   TestRateCounter(100, 800, 10, 8000);
185 }
186 
TEST_F(BweTestFramework_RateCounterFilterTest,Medium)187 TEST_F(BweTestFramework_RateCounterFilterTest, Medium) {
188   // 100ms, like above.
189   TestRateCounter(100, 800, 10, 8000);
190   // 1000ms, 100 bpp, should result in 100 pps and 80 kbps. We're still
191   // generating packets every 10 ms.
192   TestRateCounter(900, 800, 100, 80000);
193 }
194 
TEST_F(BweTestFramework_RateCounterFilterTest,Long)195 TEST_F(BweTestFramework_RateCounterFilterTest, Long) {
196   // 100ms, 1000ms, like above.
197   TestRateCounter(100, 800, 10, 8000);
198   TestRateCounter(900, 800, 100, 80000);
199   // 2000ms, should only see rate of last second, so 100 pps, and 40 kbps now.
200   TestRateCounter(1000, 400, 100, 40000);
201   // 2500ms, half a second with zero payload size. We should get same pps as
202   // before, but kbps should drop to half of previous rate.
203   TestRateCounter(500, 0, 100, 20000);
204   // Another half second with zero payload size. Now the kbps rate should drop
205   // to zero.
206   TestRateCounter(500, 0, 100, 0);
207   // Increate payload size again. 200 * 100 * 0.5 = 10 kbps.
208   TestRateCounter(500, 200, 100, 10000);
209 }
210 
TestLossFilter(float loss_percent,bool zero_tolerance)211 static void TestLossFilter(float loss_percent, bool zero_tolerance) {
212   LossFilter filter(NULL, 0);
213   filter.SetLoss(loss_percent);
214   Packets::size_type sent_packets = 0;
215   Packets::size_type remaining_packets = 0;
216 
217   // No input should yield no output
218   {
219     Packets packets;
220     sent_packets += packets.size();
221     filter.RunFor(0, &packets);
222     ASSERT_TRUE(IsTimeSorted(packets));
223     ASSERT_TRUE(IsSequenceNumberSorted(packets));
224     remaining_packets += packets.size();
225     EXPECT_EQ(0u, sent_packets);
226     EXPECT_EQ(0u, remaining_packets);
227     for (auto* packet : packets)
228       delete packet;
229   }
230 
231   // Generate and process 10000 packets in different batch sizes (some empty)
232   for (int i = 0; i < 2225; ++i) {
233     Packets packets;
234     for (int j = 0; j < i % 10; ++j)
235       packets.push_back(new MediaPacket(i, i));
236     sent_packets += packets.size();
237     filter.RunFor(0, &packets);
238     ASSERT_TRUE(IsTimeSorted(packets));
239     ASSERT_TRUE(IsSequenceNumberSorted(packets));
240     remaining_packets += packets.size();
241     for (auto* packet : packets)
242       delete packet;
243   }
244 
245   float loss_fraction = 0.01f * (100.0f - loss_percent);
246   Packets::size_type expected_packets = loss_fraction * sent_packets;
247   if (zero_tolerance) {
248     EXPECT_EQ(expected_packets, remaining_packets);
249   } else {
250     // Require within 1% of expected
251     EXPECT_NEAR(expected_packets, remaining_packets, 100);
252   }
253 }
254 
TEST(BweTestFramework_LossFilterTest,Loss0)255 TEST(BweTestFramework_LossFilterTest, Loss0) {
256   // With 0% loss, the result should be exact (no loss).
257   TestLossFilter(0.0f, true);
258 }
259 
TEST(BweTestFramework_LossFilterTest,Loss10)260 TEST(BweTestFramework_LossFilterTest, Loss10) {
261   TestLossFilter(10.0f, false);
262 }
263 
TEST(BweTestFramework_LossFilterTest,Loss50)264 TEST(BweTestFramework_LossFilterTest, Loss50) {
265   TestLossFilter(50.0f, false);
266 }
267 
TEST(BweTestFramework_LossFilterTest,Loss100)268 TEST(BweTestFramework_LossFilterTest, Loss100) {
269   // With 100% loss, the result should be exact (no packets out).
270   TestLossFilter(100.0f, true);
271 }
272 
273 class BweTestFramework_DelayFilterTest : public ::testing::Test {
274  public:
BweTestFramework_DelayFilterTest()275   BweTestFramework_DelayFilterTest()
276       : filter_(NULL, 0), now_ms_(0), sequence_number_(0) {}
~BweTestFramework_DelayFilterTest()277   virtual ~BweTestFramework_DelayFilterTest() {
278     for (auto* packet : accumulated_packets_)
279       delete packet;
280   }
281 
282  protected:
TestDelayFilter(int64_t run_for_ms,uint32_t in_packets,uint32_t out_packets)283   void TestDelayFilter(int64_t run_for_ms, uint32_t in_packets,
284                        uint32_t out_packets) {
285     Packets packets;
286     for (uint32_t i = 0; i < in_packets; ++i) {
287       packets.push_back(new MediaPacket(
288           now_ms_ * 1000 + (sequence_number_ >> 4), sequence_number_));
289       sequence_number_++;
290     }
291     filter_.RunFor(run_for_ms, &packets);
292     ASSERT_TRUE(IsTimeSorted(packets));
293     ASSERT_TRUE(IsSequenceNumberSorted(packets));
294     for (PacketsConstIt it = packets.begin(); it != packets.end(); ++it) {
295       EXPECT_LE(now_ms_ * 1000, (*it)->send_time_us());
296     }
297     EXPECT_EQ(out_packets, packets.size());
298     accumulated_packets_.splice(accumulated_packets_.end(), packets);
299     now_ms_ += run_for_ms;
300   }
301 
TestDelayFilter(int64_t delay_ms)302   void TestDelayFilter(int64_t delay_ms) {
303     filter_.SetOneWayDelayMs(delay_ms);
304     TestDelayFilter(1, 0, 0);    // No input should yield no output
305 
306     // Single packet
307     TestDelayFilter(0, 1, 1);
308     TestDelayFilter(delay_ms, 0, 0);
309 
310     for (int i = 0; i < delay_ms; ++i) {
311       filter_.SetOneWayDelayMs(i);
312       TestDelayFilter(1, 10, 10);
313     }
314     TestDelayFilter(0, 0, 0);
315     TestDelayFilter(delay_ms, 0, 0);
316 
317     // Wait a little longer - should still see no output
318     TestDelayFilter(delay_ms, 0, 0);
319 
320     for (int i = 1; i < delay_ms + 1; ++i) {
321       filter_.SetOneWayDelayMs(i);
322       TestDelayFilter(1, 5, 5);
323     }
324     TestDelayFilter(0, 0, 0);
325     filter_.SetOneWayDelayMs(2 * delay_ms);
326     TestDelayFilter(1, 0, 0);
327     TestDelayFilter(delay_ms, 13, 13);
328     TestDelayFilter(delay_ms, 0, 0);
329 
330     // Wait a little longer - should still see no output
331     TestDelayFilter(delay_ms, 0, 0);
332 
333     for (int i = 0; i < 2 * delay_ms; ++i) {
334       filter_.SetOneWayDelayMs(2 * delay_ms - i - 1);
335       TestDelayFilter(1, 5, 5);
336     }
337     TestDelayFilter(0, 0, 0);
338     filter_.SetOneWayDelayMs(0);
339     TestDelayFilter(0, 7, 7);
340 
341     ASSERT_TRUE(IsTimeSorted(accumulated_packets_));
342     ASSERT_TRUE(IsSequenceNumberSorted(accumulated_packets_));
343   }
344 
345   DelayFilter filter_;
346   Packets accumulated_packets_;
347 
348  private:
349   int64_t now_ms_;
350   uint16_t sequence_number_;
351 
352   RTC_DISALLOW_COPY_AND_ASSIGN(BweTestFramework_DelayFilterTest);
353 };
354 
TEST_F(BweTestFramework_DelayFilterTest,Delay0)355 TEST_F(BweTestFramework_DelayFilterTest, Delay0) {
356   TestDelayFilter(1, 0, 0);    // No input should yield no output
357   TestDelayFilter(1, 10, 10);  // Expect no delay (delay time is zero)
358   TestDelayFilter(1, 0, 0);    // Check no packets are still in buffer
359   filter_.SetOneWayDelayMs(0);
360   TestDelayFilter(1, 5, 5);    // Expect no delay (delay time is zero)
361   TestDelayFilter(1, 0, 0);    // Check no packets are still in buffer
362 }
363 
TEST_F(BweTestFramework_DelayFilterTest,Delay1)364 TEST_F(BweTestFramework_DelayFilterTest, Delay1) {
365   TestDelayFilter(1);
366 }
367 
TEST_F(BweTestFramework_DelayFilterTest,Delay2)368 TEST_F(BweTestFramework_DelayFilterTest, Delay2) {
369   TestDelayFilter(2);
370 }
371 
TEST_F(BweTestFramework_DelayFilterTest,Delay20)372 TEST_F(BweTestFramework_DelayFilterTest, Delay20) {
373   TestDelayFilter(20);
374 }
375 
TEST_F(BweTestFramework_DelayFilterTest,Delay100)376 TEST_F(BweTestFramework_DelayFilterTest, Delay100) {
377   TestDelayFilter(100);
378 }
379 
TEST_F(BweTestFramework_DelayFilterTest,JumpToZeroDelay)380 TEST_F(BweTestFramework_DelayFilterTest, JumpToZeroDelay) {
381   DelayFilter delay(NULL, 0);
382   Packets acc;
383   Packets packets;
384 
385   // Delay a bunch of packets, accumulate them to the 'acc' list.
386   delay.SetOneWayDelayMs(100.0f);
387   for (uint32_t i = 0; i < 10; ++i) {
388     packets.push_back(new MediaPacket(i * 100, i));
389   }
390   delay.RunFor(1000, &packets);
391   acc.splice(acc.end(), packets);
392   ASSERT_TRUE(IsTimeSorted(acc));
393   ASSERT_TRUE(IsSequenceNumberSorted(acc));
394 
395   // Drop delay to zero, send a few more packets through the delay, append them
396   // to the 'acc' list and verify that it is all sorted.
397   delay.SetOneWayDelayMs(0.0f);
398   for (uint32_t i = 10; i < 50; ++i) {
399     packets.push_back(new MediaPacket(i * 100, i));
400   }
401   delay.RunFor(1000, &packets);
402   acc.splice(acc.end(), packets);
403   ASSERT_TRUE(IsTimeSorted(acc));
404   ASSERT_TRUE(IsSequenceNumberSorted(acc));
405 
406   for (auto* packet : acc)
407     delete packet;
408 }
409 
TEST_F(BweTestFramework_DelayFilterTest,IncreasingDelay)410 TEST_F(BweTestFramework_DelayFilterTest, IncreasingDelay) {
411   // Gradually increase delay.
412   for (int i = 1; i < 50; i += 4) {
413     TestDelayFilter(i);
414   }
415   // Reach a steady state.
416   filter_.SetOneWayDelayMs(100);
417   TestDelayFilter(1, 20, 20);
418   TestDelayFilter(2, 0, 0);
419   TestDelayFilter(99, 20, 20);
420   // Drop delay back down to zero.
421   filter_.SetOneWayDelayMs(0);
422   TestDelayFilter(1, 100, 100);
423   TestDelayFilter(23010, 0, 0);
424   ASSERT_TRUE(IsTimeSorted(accumulated_packets_));
425   ASSERT_TRUE(IsSequenceNumberSorted(accumulated_packets_));
426 }
427 
TestJitterFilter(int64_t max_jitter_ms)428 static void TestJitterFilter(int64_t max_jitter_ms) {
429   JitterFilter filter(NULL, 0);
430   filter.SetMaxJitter(max_jitter_ms);
431 
432   int64_t now_ms = 0;
433   uint16_t sequence_number = 0;
434 
435   // Generate packets, add jitter to them, accumulate the altered packets.
436   Packets original;
437   Packets jittered;
438   for (uint32_t i = 0; i < 1000; ++i) {
439     Packets packets;
440     for (uint32_t j = 0; j < i % 100; ++j) {
441       packets.push_back(new MediaPacket(now_ms * 1000, sequence_number));
442       original.push_back(new MediaPacket(now_ms * 1000, sequence_number));
443       ++sequence_number;
444       now_ms += 5 * max_jitter_ms;
445     }
446     filter.RunFor(max_jitter_ms, &packets);
447     jittered.splice(jittered.end(), packets);
448   }
449 
450   // Jittered packets should still be in order.
451   ASSERT_TRUE(IsTimeSorted(original));
452   ASSERT_TRUE(IsTimeSorted(jittered));
453   ASSERT_TRUE(IsSequenceNumberSorted(original));
454   ASSERT_TRUE(IsSequenceNumberSorted(jittered));
455   EXPECT_EQ(original.size(), jittered.size());
456 
457   // Make sure jittered and original packets are in same order. Collect time
458   // difference (jitter) in stats, then check that mean jitter is close to zero
459   // and standard deviation of jitter is what we set it to.
460   Stats<double> jitter_us;
461   int64_t max_jitter_obtained_us = 0;
462   for (PacketsIt it1 = original.begin(), it2 = jittered.begin();
463        it1 != original.end() && it2 != jittered.end(); ++it1, ++it2) {
464     const MediaPacket* packet1 = static_cast<const MediaPacket*>(*it1);
465     const MediaPacket* packet2 = static_cast<const MediaPacket*>(*it2);
466     EXPECT_EQ(packet1->header().sequenceNumber,
467               packet2->header().sequenceNumber);
468     max_jitter_obtained_us =
469         std::max(max_jitter_obtained_us,
470                  packet2->send_time_us() - packet1->send_time_us());
471     jitter_us.Push(packet2->send_time_us() - packet1->send_time_us());
472   }
473   EXPECT_NEAR(filter.MeanUs(), jitter_us.GetMean(),
474               max_jitter_ms * 1000.0 * 0.01);
475   EXPECT_NEAR(max_jitter_ms * 1000.0, max_jitter_obtained_us,
476               max_jitter_ms * 1000.0 * 0.01);
477   for (auto* packet : original)
478     delete packet;
479   for (auto* packet : jittered)
480     delete packet;
481 }
482 
TEST(BweTestFramework_JitterFilterTest,Jitter0)483 TEST(BweTestFramework_JitterFilterTest, Jitter0) {
484   TestJitterFilter(0);
485 }
486 
TEST(BweTestFramework_JitterFilterTest,Jitter1)487 TEST(BweTestFramework_JitterFilterTest, Jitter1) {
488   TestJitterFilter(1);
489 }
490 
TEST(BweTestFramework_JitterFilterTest,Jitter5)491 TEST(BweTestFramework_JitterFilterTest, Jitter5) {
492   TestJitterFilter(5);
493 }
494 
TEST(BweTestFramework_JitterFilterTest,Jitter10)495 TEST(BweTestFramework_JitterFilterTest, Jitter10) {
496   TestJitterFilter(10);
497 }
498 
TEST(BweTestFramework_JitterFilterTest,Jitter1031)499 TEST(BweTestFramework_JitterFilterTest, Jitter1031) {
500   TestJitterFilter(1031);
501 }
502 
TestReorderFilter(uint16_t reorder_percent)503 static void TestReorderFilter(uint16_t reorder_percent) {
504   const uint16_t kPacketCount = 10000;
505 
506   // Generate packets with 10 ms interval.
507   Packets packets;
508   int64_t now_ms = 0;
509   uint16_t sequence_number = 1;
510   for (uint16_t i = 0; i < kPacketCount; ++i, now_ms += 10) {
511     packets.push_back(new MediaPacket(now_ms * 1000, sequence_number++));
512   }
513   ASSERT_TRUE(IsTimeSorted(packets));
514   ASSERT_TRUE(IsSequenceNumberSorted(packets));
515 
516   // Reorder packets, verify that send times are still in order.
517   ReorderFilter filter(NULL, 0);
518   filter.SetReorder(reorder_percent);
519   filter.RunFor(now_ms, &packets);
520   ASSERT_TRUE(IsTimeSorted(packets));
521 
522   // We measure the amount of reordering by summing the distance by which out-
523   // of-order packets have been moved in the stream.
524   uint16_t distance = 0;
525   uint16_t last_sequence_number = 0;
526   for (auto* packet : packets) {
527     const MediaPacket* media_packet = static_cast<const MediaPacket*>(packet);
528     uint16_t sequence_number = media_packet->header().sequenceNumber;
529     // The expected position for sequence number s is in position s-1.
530     if (sequence_number < last_sequence_number) {
531       distance += last_sequence_number - sequence_number;
532     }
533     last_sequence_number = sequence_number;
534   }
535 
536   // The probability that two elements are swapped is p = reorder_percent / 100.
537   double p = static_cast<double>(reorder_percent) / 100;
538   // The expected number of swaps we perform is p * (PacketCount - 1),
539   // and each swap increases the distance by one.
540   double mean = p * (kPacketCount - 1);
541   // If pair i is chosen to be swapped with probability p, the variance for that
542   // pair is p * (1 - p). Since there are (kPacketCount - 1) independent pairs,
543   // the variance for the number of swaps is (kPacketCount - 1) * p * (1 - p).
544   double std_deviation = sqrt((kPacketCount - 1) * p * (1 - p));
545   EXPECT_NEAR(mean, distance, 3 * std_deviation);
546 
547   for (auto* packet : packets)
548     delete packet;
549 }
550 
TEST(BweTestFramework_ReorderFilterTest,Reorder0)551 TEST(BweTestFramework_ReorderFilterTest, Reorder0) {
552   // For 0% reordering, no packets should have been moved, so result is exact.
553   TestReorderFilter(0);
554 }
555 
TEST(BweTestFramework_ReorderFilterTest,Reorder10)556 TEST(BweTestFramework_ReorderFilterTest, Reorder10) {
557   TestReorderFilter(10);
558 }
559 
TEST(BweTestFramework_ReorderFilterTest,Reorder20)560 TEST(BweTestFramework_ReorderFilterTest, Reorder20) {
561   TestReorderFilter(20);
562 }
563 
TEST(BweTestFramework_ReorderFilterTest,Reorder50)564 TEST(BweTestFramework_ReorderFilterTest, Reorder50) {
565   TestReorderFilter(50);
566 }
567 
TEST(BweTestFramework_ReorderFilterTest,Reorder70)568 TEST(BweTestFramework_ReorderFilterTest, Reorder70) {
569   TestReorderFilter(70);
570 }
571 
TEST(BweTestFramework_ReorderFilterTest,Reorder100)572 TEST(BweTestFramework_ReorderFilterTest, Reorder100) {
573   // Note that because the implementation works by optionally swapping two
574   // adjacent packets, when the likelihood of a swap is 1.0, a swap will always
575   // occur, so the stream will be in order except for the first packet, which
576   // has been moved to the end. Therefore we expect the result to be exact here.
577   TestReorderFilter(100.0);
578 }
579 
580 class BweTestFramework_ChokeFilterTest : public ::testing::Test {
581  public:
BweTestFramework_ChokeFilterTest()582   BweTestFramework_ChokeFilterTest()
583     : now_ms_(0),
584       sequence_number_(0),
585       output_packets_(),
586       send_times_us_() {
587   }
~BweTestFramework_ChokeFilterTest()588   virtual ~BweTestFramework_ChokeFilterTest() {
589     for (auto* packet : output_packets_)
590       delete packet;
591   }
592 
593  protected:
TestChoke(PacketProcessor * filter,int64_t run_for_ms,uint32_t packets_to_generate,size_t expected_kbit_transmitted)594   void TestChoke(PacketProcessor* filter,
595                  int64_t run_for_ms,
596                  uint32_t packets_to_generate,
597                  size_t expected_kbit_transmitted) {
598     // Generate a bunch of packets, apply choke, verify output is ordered.
599     Packets packets;
600     RTPHeader header;
601     for (uint32_t i = 0; i < packets_to_generate; ++i) {
602       int64_t send_time_ms = now_ms_ + (i * run_for_ms) / packets_to_generate;
603       header.sequenceNumber = sequence_number_++;
604       // Payload is 1000 bits.
605       packets.push_back(new MediaPacket(0, send_time_ms * 1000, 125, header));
606       send_times_us_.push_back(send_time_ms * 1000);
607     }
608     ASSERT_TRUE(IsTimeSorted(packets));
609     filter->RunFor(run_for_ms, &packets);
610     now_ms_ += run_for_ms;
611     output_packets_.splice(output_packets_.end(), packets);
612     ASSERT_TRUE(IsTimeSorted(output_packets_));
613     ASSERT_TRUE(IsSequenceNumberSorted(output_packets_));
614 
615     // Sum up the transmitted bytes up until the current time.
616     size_t bytes_transmitted = 0;
617     while (!output_packets_.empty()) {
618       const Packet* packet = output_packets_.front();
619       if (packet->send_time_us() > now_ms_ * 1000) {
620         break;
621       }
622       bytes_transmitted += packet->payload_size();
623       delete output_packets_.front();
624       output_packets_.pop_front();
625     }
626     EXPECT_EQ(expected_kbit_transmitted, (bytes_transmitted * 8 + 500) / 1000);
627   }
628 
CheckMaxDelay(int64_t max_delay_ms)629   void CheckMaxDelay(int64_t max_delay_ms) {
630     for (const auto* packet : output_packets_) {
631       const MediaPacket* media_packet = static_cast<const MediaPacket*>(packet);
632       int64_t delay_us = media_packet->send_time_us() -
633                          send_times_us_[media_packet->header().sequenceNumber];
634       EXPECT_GE(max_delay_ms * 1000, delay_us);
635     }
636   }
637 
638  private:
639   int64_t now_ms_;
640   uint16_t sequence_number_;
641   Packets output_packets_;
642   std::vector<int64_t> send_times_us_;
643 
644   RTC_DISALLOW_COPY_AND_ASSIGN(BweTestFramework_ChokeFilterTest);
645 };
646 
TEST_F(BweTestFramework_ChokeFilterTest,NoQueue)647 TEST_F(BweTestFramework_ChokeFilterTest, NoQueue) {
648   const int kCapacityKbps = 10;
649   const size_t kPacketSizeBytes = 125;
650   const int64_t kExpectedSendTimeUs =
651       (kPacketSizeBytes * 8 * 1000 + kCapacityKbps / 2) / kCapacityKbps;
652   uint16_t sequence_number = 0;
653   int64_t send_time_us = 0;
654   ChokeFilter filter(NULL, 0);
655   filter.set_capacity_kbps(10);
656   Packets packets;
657   RTPHeader header;
658   for (int i = 0; i < 2; ++i) {
659     header.sequenceNumber = sequence_number++;
660     // Payload is 1000 bits.
661     packets.push_back(
662         new MediaPacket(0, send_time_us, kPacketSizeBytes, header));
663     // Packets are sent far enough a part plus an extra millisecond so that they
664     // will never be in the choke queue at the same time.
665     send_time_us += kExpectedSendTimeUs + 1000;
666   }
667   ASSERT_TRUE(IsTimeSorted(packets));
668   filter.RunFor(2 * kExpectedSendTimeUs + 1000, &packets);
669   EXPECT_EQ(kExpectedSendTimeUs, packets.front()->send_time_us());
670   delete packets.front();
671   packets.pop_front();
672   EXPECT_EQ(2 * kExpectedSendTimeUs + 1000, packets.front()->send_time_us());
673   delete packets.front();
674   packets.pop_front();
675 }
676 
TEST_F(BweTestFramework_ChokeFilterTest,Short)677 TEST_F(BweTestFramework_ChokeFilterTest, Short) {
678   // 100ms, 100 packets, 10 kbps choke -> 1 kbit of data should have propagated.
679   // That is actually just a single packet, since each packet has 1000 bits of
680   // payload.
681   ChokeFilter filter(NULL, 0);
682   filter.set_capacity_kbps(10);
683   TestChoke(&filter, 100, 100, 1);
684 }
685 
TEST_F(BweTestFramework_ChokeFilterTest,Medium)686 TEST_F(BweTestFramework_ChokeFilterTest, Medium) {
687   // 100ms, 10 packets, 10 kbps choke -> 1 packet through, or 1 kbit.
688   ChokeFilter filter(NULL, 0);
689   filter.set_capacity_kbps(10);
690   TestChoke(&filter, 100, 10, 1);
691   // 200ms, no new packets -> another packet through.
692   TestChoke(&filter, 100, 0, 1);
693   // 1000ms, no new packets -> 8 more packets.
694   TestChoke(&filter, 800, 0, 8);
695   // 2000ms, no new packets -> queue is empty so no output.
696   TestChoke(&filter, 1000, 0, 0);
697 }
698 
TEST_F(BweTestFramework_ChokeFilterTest,Long)699 TEST_F(BweTestFramework_ChokeFilterTest, Long) {
700   // 100ms, 100 packets in queue, 10 kbps choke -> 1 packet through, or 1 kbit.
701   ChokeFilter filter(NULL, 0);
702   filter.set_capacity_kbps(10);
703   TestChoke(&filter, 100, 100, 1);
704   // 200ms, no input, another packet through.
705   TestChoke(&filter, 100, 0, 1);
706   // 1000ms, no input, 8 packets through.
707   TestChoke(&filter, 800, 0, 8);
708   // 10000ms, no input, raise choke to 100 kbps. Remaining 90 packets in queue
709   // should be propagated, for a total of 90 kbps.
710   filter.set_capacity_kbps(100);
711   TestChoke(&filter, 9000, 0, 90);
712   // 10100ms, 20 more packets -> 10 packets or 10 kbit through.
713   TestChoke(&filter, 100, 20, 10);
714   // 10300ms, 10 more packets -> 20 packets out.
715   TestChoke(&filter, 200, 10, 20);
716   // 11300ms, no input, queue should be empty.
717   filter.set_capacity_kbps(10);
718   TestChoke(&filter, 1000, 0, 0);
719 }
720 
TEST_F(BweTestFramework_ChokeFilterTest,MaxDelay)721 TEST_F(BweTestFramework_ChokeFilterTest, MaxDelay) {
722   // 10 kbps choke, 500 ms delay cap
723   ChokeFilter filter(NULL, 0);
724   filter.set_capacity_kbps(10);
725   filter.set_max_delay_ms(500);
726   // 100ms, 100 packets in queue, 10 kbps choke -> 1 packet through, or 1 kbit.
727   TestChoke(&filter, 100, 100, 1);
728   CheckMaxDelay(500);
729   // 500ms, no input, 4 more packets through.
730   TestChoke(&filter, 400, 0, 4);
731   // 10000ms, no input, remaining packets should have been dropped.
732   TestChoke(&filter, 9500, 0, 0);
733 
734   // 100 ms delay cap
735   filter.set_max_delay_ms(100);
736   // 10100ms, 50 more packets -> 1 packets or 1 kbit through.
737   TestChoke(&filter, 100, 50, 1);
738   CheckMaxDelay(100);
739   // 20000ms, no input, remaining packets in queue should have been dropped.
740   TestChoke(&filter, 9900, 0, 0);
741 
742   // Reset delay cap (0 is no cap) and verify no packets are dropped.
743   filter.set_capacity_kbps(10);
744   filter.set_max_delay_ms(0);
745   TestChoke(&filter, 100, 100, 1);
746   TestChoke(&filter, 9900, 0, 99);
747 }
748 
TEST_F(BweTestFramework_ChokeFilterTest,ShortTrace)749 TEST_F(BweTestFramework_ChokeFilterTest, ShortTrace) {
750   // According to the input file 6 packets should be transmitted within
751   // 100 milliseconds.
752   TraceBasedDeliveryFilter filter(NULL, 0);
753   ASSERT_TRUE(filter.Init(test::ResourcePath("synthetic-trace", "rx")));
754   TestChoke(&filter, 100, 100, 6);
755 }
756 
TEST_F(BweTestFramework_ChokeFilterTest,ShortTraceTwoWraps)757 TEST_F(BweTestFramework_ChokeFilterTest, ShortTraceTwoWraps) {
758   // According to the input file 19 packets should be transmitted within
759   // 280 milliseconds (at the wrapping point two packets are sent back to back).
760   TraceBasedDeliveryFilter filter(NULL, 0);
761   ASSERT_TRUE(filter.Init(test::ResourcePath("synthetic-trace", "rx")));
762   TestChoke(&filter, 280, 100, 19);
763 }
764 
TEST_F(BweTestFramework_ChokeFilterTest,ShortTraceMaxDelay)765 TEST_F(BweTestFramework_ChokeFilterTest, ShortTraceMaxDelay) {
766   TraceBasedDeliveryFilter filter(NULL, 0);
767   filter.set_max_delay_ms(25);
768   ASSERT_TRUE(filter.Init(test::ResourcePath("synthetic-trace", "rx")));
769   // Uses all slots up to 110 ms. Several packets are being dropped.
770   TestChoke(&filter, 110, 20, 9);
771   CheckMaxDelay(25);
772   // Simulate enough time for the next slot (at 135 ms) to be used. This makes
773   // sure that a slot isn't missed between runs.
774   TestChoke(&filter, 25, 1, 1);
775 }
776 
TestVideoSender(VideoSender * sender,int64_t run_for_ms,uint32_t expected_packets,uint32_t expected_payload_size,size_t expected_total_payload_size)777 void TestVideoSender(VideoSender* sender,
778                      int64_t run_for_ms,
779                      uint32_t expected_packets,
780                      uint32_t expected_payload_size,
781                      size_t expected_total_payload_size) {
782   assert(sender);
783   Packets packets;
784   sender->RunFor(run_for_ms, &packets);
785   ASSERT_TRUE(IsTimeSorted(packets));
786   ASSERT_TRUE(IsSequenceNumberSorted(packets));
787   EXPECT_EQ(expected_packets, packets.size());
788 
789   int64_t send_time_us = -1;
790   size_t total_payload_size = 0;
791   uint32_t absolute_send_time = 0;
792   uint32_t absolute_send_time_wraps = 0;
793   uint32_t rtp_timestamp = 0;
794   uint32_t rtp_timestamp_wraps = 0;
795 
796   for (const auto* packet : packets) {
797     const MediaPacket* media_packet = static_cast<const MediaPacket*>(packet);
798     EXPECT_LE(send_time_us, media_packet->send_time_us());
799     send_time_us = media_packet->send_time_us();
800     if (sender->source()->max_payload_size_bytes() !=
801         media_packet->payload_size()) {
802       EXPECT_EQ(expected_payload_size, media_packet->payload_size());
803     }
804     total_payload_size += media_packet->payload_size();
805     if (absolute_send_time >
806         media_packet->header().extension.absoluteSendTime) {
807       absolute_send_time_wraps++;
808     }
809     absolute_send_time = media_packet->header().extension.absoluteSendTime;
810     if (rtp_timestamp > media_packet->header().timestamp) {
811       rtp_timestamp_wraps++;
812     }
813     rtp_timestamp = media_packet->header().timestamp;
814   }
815 
816   EXPECT_EQ(expected_total_payload_size, total_payload_size);
817   EXPECT_GE(1u, absolute_send_time_wraps);
818   EXPECT_GE(1u, rtp_timestamp_wraps);
819 
820   for (auto* packet : packets)
821     delete packet;
822 }
823 
824 // Random {-1, 0, +1} ms was added to frame timestamps.
825 
TEST(BweTestFramework_VideoSenderTest,Fps1Kbps80_1s)826 TEST(BweTestFramework_VideoSenderTest, Fps1Kbps80_1s) {
827   // 1 fps, 80 kbps
828   VideoSource source(0, 1.0f, 80, 0x1234, 0);
829   VideoSender sender(NULL, &source, kNullEstimator);
830   EXPECT_EQ(80000u, source.bits_per_second());
831   // We're at 1 fps, so all packets should be generated on first call, giving 10
832   // packets of each 1000 bytes, total 10000 bytes.
833   TestVideoSender(&sender, 1, 9, 400, 10000);
834   // 998ms, should see no output here.
835   TestVideoSender(&sender, 997, 0, 0, 0);
836   // 1001ms, should get data for one more frame.
837   TestVideoSender(&sender, 3, 9, 400, 10000);
838   // 1998ms, should see no output here.
839   TestVideoSender(&sender, 997, 0, 0, 0);
840   // 2001ms, one more frame.
841   TestVideoSender(&sender, 3, 9, 400, 10000);
842   // 2998ms, should see nothing.
843   TestVideoSender(&sender, 997, 0, 0, 0);
844 }
845 
TEST(BweTestFramework_VideoSenderTest,Fps1Kbps80_1s_Offset)846 TEST(BweTestFramework_VideoSenderTest, Fps1Kbps80_1s_Offset) {
847   // 1 fps, 80 kbps, offset 0.5 of a frame period, ==0.5s in this case.
848   VideoSource source(0, 1.0f, 80, 0x1234, 500);
849   VideoSender sender(NULL, &source, kNullEstimator);
850   EXPECT_EQ(80000u, source.bits_per_second());
851   // 498ms, no output.
852   TestVideoSender(&sender, 498, 0, 0, 0);
853   // 501ms, first frame (this is the offset we set), 10 packets of 1000 bytes.
854   TestVideoSender(&sender, 3, 9, 400, 10000);
855   // 1498ms, nothing.
856   TestVideoSender(&sender, 997, 0, 0, 0);
857   // 1501ms, second frame.
858   TestVideoSender(&sender, 3, 9, 400, 10000);
859   // 2498ms, nothing.
860   TestVideoSender(&sender, 997, 0, 0, 0);
861   // 2501ms, third frame.
862   TestVideoSender(&sender, 3, 9, 400, 10000);
863   // 3498ms, nothing.
864   TestVideoSender(&sender, 997, 0, 0, 0);
865 }
866 
TEST(BweTestFramework_VideoSenderTest,Fps50Kpbs80_11s)867 TEST(BweTestFramework_VideoSenderTest, Fps50Kpbs80_11s) {
868   // 50 fps, 80 kbps.
869   VideoSource source(0, 50.0f, 80, 0x1234, 0);
870   VideoSender sender(NULL, &source, kNullEstimator);
871   EXPECT_EQ(80000u, source.bits_per_second());
872   // 9981, should see 500 frames, 200 byte payloads, total 100000 bytes.
873   TestVideoSender(&sender, 9981, 500, 200, 100000);
874   // 9998ms, nothing.
875   TestVideoSender(&sender, 17, 0, 0, 0);
876   // 10001ms, 501st frame as a single packet.
877   TestVideoSender(&sender, 3, 1, 200, 200);
878   // 10981ms, 49 more frames.
879   TestVideoSender(&sender, 981, 49, 200, 9800);
880   // 10998ms, nothing.
881   TestVideoSender(&sender, 17, 0, 0, 0);
882 }
883 
TEST(BweTestFramework_VideoSenderTest,Fps20Kpbs120_1s)884 TEST(BweTestFramework_VideoSenderTest, Fps20Kpbs120_1s) {
885   // 20 fps, 120 kbps.
886   VideoSource source(0, 20.0f, 120, 0x1234, 0);
887   VideoSender sender(NULL, &source, kNullEstimator);
888   EXPECT_EQ(120000u, source.bits_per_second());
889   // 451ms, 10 frames with 750 byte payloads, total 7500 bytes.
890   TestVideoSender(&sender, 451, 10, 750, 7500);
891   // 498ms, nothing.
892   TestVideoSender(&sender, 47, 0, 0, 0);
893   // 501ms, one more frame.
894   TestVideoSender(&sender, 3, 1, 750, 750);
895   // 951ms, 9 more frames.
896   TestVideoSender(&sender, 450, 9, 750, 6750);
897   // 998ms, nothing.
898   TestVideoSender(&sender, 47, 0, 0, 0);
899 }
900 
TEST(BweTestFramework_VideoSenderTest,Fps25Kbps820_20s)901 TEST(BweTestFramework_VideoSenderTest, Fps25Kbps820_20s) {
902   // 25 fps, 820 kbps.
903   VideoSource source(0, 25.0f, 820, 0x1234, 0);
904   VideoSender sender(NULL, &source, kNullEstimator);
905   EXPECT_EQ(820000u, source.bits_per_second());
906   // 9961ms, 250 frames. 820 kbps = 102500 bytes/s, so total should be 1025000.
907   // Each frame is 102500/25=4100 bytes, or 5 packets (4 @1000 bytes, 1 @100),
908   // so packet count should be 5*250=1250 and last packet of each frame has
909   // 100 bytes of payload.
910   TestVideoSender(&sender, 9961, 1000, 500, 1025000);
911   // 9998ms, nothing.
912   TestVideoSender(&sender, 37, 0, 0, 0);
913   // 19961ms, 250 more frames.
914   TestVideoSender(&sender, 9963, 1000, 500, 1025000);
915   // 19998ms, nothing.
916   TestVideoSender(&sender, 37, 0, 0, 0);
917   // 20001ms, one more frame, as described above (25fps == 40ms/frame).
918   TestVideoSender(&sender, 3, 4, 500, 4100);
919   // 20038ms, nothing.
920   TestVideoSender(&sender, 37, 0, 0, 0);
921 }
922 
TEST(BweTestFramework_VideoSenderTest,TestAppendInOrder)923 TEST(BweTestFramework_VideoSenderTest, TestAppendInOrder) {
924   // 1 fps, 80 kbps, 250ms offset.
925   VideoSource source1(0, 1.0f, 80, 0x1234, 250);
926   VideoSender sender1(NULL, &source1, kNullEstimator);
927   EXPECT_EQ(80000u, source1.bits_per_second());
928   Packets packets;
929   // Generate some packets, verify they are sorted.
930   sender1.RunFor(999, &packets);
931   ASSERT_TRUE(IsTimeSorted(packets));
932   ASSERT_TRUE(IsSequenceNumberSorted(packets));
933   EXPECT_EQ(9u, packets.size());
934   // Generate some more packets and verify they are appended to end of list.
935   sender1.RunFor(1000, &packets);
936   ASSERT_TRUE(IsTimeSorted(packets));
937   ASSERT_TRUE(IsSequenceNumberSorted(packets));
938   EXPECT_EQ(18u, packets.size());
939 
940   // Another sender, 2 fps, 160 kbps, 150ms offset
941   VideoSource source2(0, 2.0f, 160, 0x2234, 150);
942   VideoSender sender2(NULL, &source2, kNullEstimator);
943   EXPECT_EQ(160000u, source2.bits_per_second());
944   // Generate some packets, verify that they are merged with the packets already
945   // on the list.
946   sender2.RunFor(999, &packets);
947   ASSERT_TRUE(IsTimeSorted(packets));
948   EXPECT_EQ(36u, packets.size());
949   // Generate some more.
950   sender2.RunFor(1000, &packets);
951   ASSERT_TRUE(IsTimeSorted(packets));
952   EXPECT_EQ(54u, packets.size());
953 
954   for (auto* packet : packets)
955     delete packet;
956 }
957 
TEST(BweTestFramework_VideoSenderTest,FeedbackIneffective)958 TEST(BweTestFramework_VideoSenderTest, FeedbackIneffective) {
959   VideoSource source(0, 25.0f, 820, 0x1234, 0);
960   VideoSender sender(NULL, &source, kNullEstimator);
961 
962   EXPECT_EQ(820000u, source.bits_per_second());
963   TestVideoSender(&sender, 9961, 1000, 500, 1025000);
964 
965   // Make sure feedback has no effect on a regular video sender.
966   RembFeedback* feedback = new RembFeedback(0, 0, 0, 512000, RTCPReportBlock());
967   Packets packets;
968   packets.push_back(feedback);
969   sender.RunFor(0, &packets);
970   EXPECT_EQ(820000u, source.bits_per_second());
971   TestVideoSender(&sender, 10000, 1000, 500, 1025000);
972 }
973 
TEST(BweTestFramework_AdaptiveVideoSenderTest,FeedbackChangesBitrate)974 TEST(BweTestFramework_AdaptiveVideoSenderTest, FeedbackChangesBitrate) {
975   AdaptiveVideoSource source(0, 25.0f, 820, 0x1234, 0);
976   VideoSender sender(NULL, &source, kRembEstimator);
977   EXPECT_EQ(820000u, source.bits_per_second());
978   TestVideoSender(&sender, 9961, 1000, 500, 1025000);
979 
980   // Make sure we can reduce the bitrate.
981   RembFeedback* feedback = new RembFeedback(0, 0, 0, 512000, RTCPReportBlock());
982   Packets packets;
983   packets.push_back(feedback);
984   sender.RunFor(0, &packets);
985   EXPECT_EQ(512000u, source.bits_per_second());
986   TestVideoSender(&sender, 10000, 750, 160, 640000);
987 
988   // Increase the bitrate to the initial bitrate and verify that the output is
989   // the same.
990   feedback = new RembFeedback(0, 0, 0, 820000, RTCPReportBlock());
991   packets.push_back(feedback);
992   sender.RunFor(10000, &packets);
993   EXPECT_EQ(820000u, source.bits_per_second());
994 
995   for (auto* packet : packets)
996     delete packet;
997 }
998 
TEST(BweTestFramework_AdaptiveVideoSenderTest,Paced_FeedbackChangesBitrate)999 TEST(BweTestFramework_AdaptiveVideoSenderTest, Paced_FeedbackChangesBitrate) {
1000   AdaptiveVideoSource source(0, 25.0f, 820, 0x1234, 0);
1001   PacedVideoSender sender(NULL, &source, kRembEstimator);
1002   EXPECT_EQ(820000u, source.bits_per_second());
1003   TestVideoSender(&sender, 9998, 1000, 500, 1025000);
1004 
1005   // Make sure we can reduce the bitrate.
1006   RembFeedback* feedback = new RembFeedback(0, 1, 0, 512000, RTCPReportBlock());
1007   Packets packets;
1008   packets.push_back(feedback);
1009   sender.RunFor(10000, &packets);
1010   ASSERT_EQ(512000u, source.bits_per_second());
1011   TestVideoSender(&sender, 10000, 750, 160, 640000);
1012 
1013   // Increase the bitrate to the initial bitrate and verify that the output is
1014   // the same.
1015   feedback = new RembFeedback(0, 0, 0, 820000, RTCPReportBlock());
1016   packets.push_back(feedback);
1017   sender.RunFor(10000, &packets);
1018   EXPECT_EQ(820000u, source.bits_per_second());
1019 
1020   for (auto* packet : packets)
1021     delete packet;
1022 }
1023 }  // namespace bwe
1024 }  // namespace testing
1025 }  // namespace webrtc
1026