2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
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.
11 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
15 #include "gtest/gtest.h"
16 #include "webrtc/system_wrappers/interface/constructor_magic.h"
24 TEST(BweTestFramework_RandomTest, Gaussian) {
32 Random random(0x12345678);
34 int buckets[kBuckets] = {0};
35 for (int i = 0; i < kN; ++i) {
36 int index = random.Gaussian(kMean, kStddev);
37 if (index >= 0 && index < kBuckets) {
42 const double kPi = 3.14159265358979323846;
43 const double kScale = kN / (kStddev * std::sqrt(2.0 * kPi));
44 const double kDiv = -2.0 * kStddev * kStddev;
45 double self_corr = 0.0;
46 double bucket_corr = 0.0;
47 for (int n = 0; n < kBuckets; ++n) {
48 double normal_dist = kScale * std::exp((n - kMean) * (n - kMean) / kDiv);
49 self_corr += normal_dist * normal_dist;
50 bucket_corr += normal_dist * buckets[n];
52 printf("Correlation: %f (random sample), %f (self), %f (quotient)\n",
53 bucket_corr, self_corr, bucket_corr / self_corr);
54 EXPECT_NEAR(1.0, bucket_corr / self_corr, 0.0004);
57 static bool IsSequenceNumberSorted(const Packets& packets) {
58 PacketsConstIt last_it = packets.begin();
59 for (PacketsConstIt it = last_it; it != packets.end(); ++it) {
60 if (IsNewerSequenceNumber(last_it->header().sequenceNumber,
61 it->header().sequenceNumber)) {
69 TEST(BweTestFramework_BwePacketTest, IsTimeSorted) {
71 // Insert some packets in order...
72 EXPECT_TRUE(IsTimeSorted(packets));
74 packets.push_back(BwePacket(100, 0));
75 EXPECT_TRUE(IsTimeSorted(packets));
77 packets.push_back(BwePacket(110, 0));
78 EXPECT_TRUE(IsTimeSorted(packets));
80 // ...and one out-of-order...
81 packets.push_back(BwePacket(100, 0));
82 EXPECT_FALSE(IsTimeSorted(packets));
84 // ...remove the out-of-order packet, insert another in-order packet.
86 packets.push_back(BwePacket(120, 0));
87 EXPECT_TRUE(IsTimeSorted(packets));
90 TEST(BweTestFramework_BwePacketTest, IsSequenceNumberSorted) {
92 // Insert some packets in order...
93 EXPECT_TRUE(IsSequenceNumberSorted(packets));
95 packets.push_back(BwePacket(0, 100));
96 EXPECT_TRUE(IsSequenceNumberSorted(packets));
98 packets.push_back(BwePacket(0, 110));
99 EXPECT_TRUE(IsSequenceNumberSorted(packets));
101 // ...and one out-of-order...
102 packets.push_back(BwePacket(0, 100));
103 EXPECT_FALSE(IsSequenceNumberSorted(packets));
105 // ...remove the out-of-order packet, insert another in-order packet.
107 packets.push_back(BwePacket(0, 120));
108 EXPECT_TRUE(IsSequenceNumberSorted(packets));
111 TEST(BweTestFramework_StatsTest, Mean) {
112 Stats<int32_t> stats;
113 EXPECT_EQ(0, stats.GetMean());
117 EXPECT_EQ(2, stats.GetMean());
119 // Integer division rounds (1+3-3)/3 to 0.
121 EXPECT_EQ(0, stats.GetMean());
124 TEST(BweTestFramework_StatsTest, Variance) {
125 Stats<int32_t> stats;
126 EXPECT_EQ(0, stats.GetVariance());
128 // Mean is 2 ; ((1-2)*(1-2)+(3-2)*(3-2))/2 = (1+1)/2 = 1
131 EXPECT_EQ(1, stats.GetVariance());
133 // Integer division rounds 26/3 to 8
134 // Mean is 0 ; (1*1+3*3+(-4)*(-4))/3 = (1+9+16)/3 = 8
136 EXPECT_EQ(8, stats.GetVariance());
139 TEST(BweTestFramework_StatsTest, StdDev) {
140 Stats<int32_t> stats;
141 EXPECT_EQ(0, stats.GetStdDev());
143 // Variance is 1 ; sqrt(1) = 1
146 EXPECT_EQ(1, stats.GetStdDev());
148 // Variance is 8 ; sqrt(8) = 2 with integers.
150 EXPECT_EQ(2, stats.GetStdDev());
153 TEST(BweTestFramework_StatsTest, MinMax) {
154 Stats<int32_t> stats;
155 EXPECT_EQ(0, stats.GetMin());
156 EXPECT_EQ(0, stats.GetMax());
159 EXPECT_EQ(1, stats.GetMin());
160 EXPECT_EQ(1, stats.GetMax());
163 EXPECT_EQ(1, stats.GetMin());
164 EXPECT_EQ(3, stats.GetMax());
167 EXPECT_EQ(-4, stats.GetMin());
168 EXPECT_EQ(3, stats.GetMax());
171 void TestVideoSender(VideoSender* sender, int64_t run_for_ms,
172 uint32_t expected_packets,
173 uint32_t expected_payload_size,
174 uint32_t expected_total_payload_size) {
177 sender->RunFor(run_for_ms, &packets);
178 ASSERT_TRUE(IsTimeSorted(packets));
179 ASSERT_TRUE(IsSequenceNumberSorted(packets));
180 EXPECT_EQ(expected_packets, packets.size());
181 int64_t send_time_us = -1;
182 uint32_t total_payload_size = 0;
183 uint32_t absolute_send_time = 0;
184 uint32_t absolute_send_time_wraps = 0;
185 uint32_t rtp_timestamp = 0;
186 uint32_t rtp_timestamp_wraps = 0;
187 for (PacketsIt it = packets.begin(); it != packets.end(); ++it) {
188 EXPECT_LE(send_time_us, it->send_time_us());
189 send_time_us = it->send_time_us();
190 if (sender->max_payload_size_bytes() != it->payload_size()) {
191 EXPECT_EQ(expected_payload_size, it->payload_size());
193 total_payload_size += it->payload_size();
194 if (absolute_send_time > it->header().extension.absoluteSendTime) {
195 absolute_send_time_wraps++;
197 absolute_send_time = it->header().extension.absoluteSendTime;
198 if (rtp_timestamp > it->header().timestamp) {
199 rtp_timestamp_wraps++;
201 rtp_timestamp = it->header().timestamp;
203 EXPECT_EQ(expected_total_payload_size, total_payload_size);
204 EXPECT_GE(1u, absolute_send_time_wraps);
205 EXPECT_GE(1u, rtp_timestamp_wraps);
208 TEST(BweTestFramework_VideoSenderTest, Fps1Kpbs80_1s) {
210 VideoSender sender(1.0f, 80, 0x1234, 0);
211 EXPECT_EQ(10000u, sender.bytes_per_second());
212 // We're at 1 fps, so all packets should be generated on first call, giving 10
213 // packets of each 1000 bytes, total 10000 bytes.
214 TestVideoSender(&sender, 1, 10, 1000, 10000);
215 // 999ms, should see no output here.
216 TestVideoSender(&sender, 998, 0, 0, 0);
217 // 1999ms, should get data for one more frame.
218 TestVideoSender(&sender, 1000, 10, 1000, 10000);
219 // 2000ms, one more frame.
220 TestVideoSender(&sender, 1, 10, 1000, 10000);
221 // 2999ms, should see nothing.
222 TestVideoSender(&sender, 999, 0, 0, 0);
225 TEST(BweTestFramework_VideoSenderTest, Fps1Kpbs80_1s_Offset) {
226 // 1 fps, 80 kbps, offset 0.5 of a frame period, ==0.5s in this case.
227 VideoSender sender(1.0f, 80, 0x1234, 0.5f);
228 EXPECT_EQ(10000u, sender.bytes_per_second());
230 TestVideoSender(&sender, 499, 0, 0, 0);
231 // 500ms, first frame (this is the offset we set), 10 packets of 1000 bytes.
232 TestVideoSender(&sender, 1, 10, 1000, 10000);
234 TestVideoSender(&sender, 999, 0, 0, 0);
235 // 1999ms, second frame.
236 TestVideoSender(&sender, 500, 10, 1000, 10000);
238 TestVideoSender(&sender, 500, 0, 0, 0);
239 // 2500ms, third frame.
240 TestVideoSender(&sender, 1, 10, 1000, 10000);
242 TestVideoSender(&sender, 999, 0, 0, 0);
245 TEST(BweTestFramework_VideoSenderTest, Fps50Kpbs80_11s) {
247 VideoSender sender(50.0f, 80, 0x1234, 0);
248 EXPECT_EQ(10000u, sender.bytes_per_second());
249 // 9998ms, should see 500 frames, 200 byte payloads, total 100000 bytes.
250 TestVideoSender(&sender, 9998, 500, 200, 100000);
252 TestVideoSender(&sender, 1, 0, 0, 0);
253 // 10000ms, 501st frame as a single packet.
254 TestVideoSender(&sender, 1, 1, 200, 200);
255 // 10998ms, 49 more frames.
256 TestVideoSender(&sender, 998, 49, 200, 9800);
258 TestVideoSender(&sender, 1, 0, 0, 0);
261 TEST(BweTestFramework_VideoSenderTest, Fps10Kpbs120_1s) {
263 VideoSender sender(20.0f, 120, 0x1234, 0);
264 EXPECT_EQ(15000u, sender.bytes_per_second());
265 // 498ms, 10 frames with 750 byte payloads, total 7500 bytes.
266 TestVideoSender(&sender, 498, 10, 750, 7500);
268 TestVideoSender(&sender, 1, 0, 0, 0);
269 // 500ms, one more frame.
270 TestVideoSender(&sender, 1, 1, 750, 750);
271 // 998ms, 9 more frames.
272 TestVideoSender(&sender, 498, 9, 750, 6750);
274 TestVideoSender(&sender, 1, 0, 0, 0);
277 TEST(BweTestFramework_VideoSenderTest, Fps30Kpbs800_20s) {
279 VideoSender sender(25.0f, 820, 0x1234, 0);
280 EXPECT_EQ(102500u, sender.bytes_per_second());
281 // 9998ms, 250 frames. 820 kbps = 102500 bytes/s, so total should be 1025000.
282 // Each frame is 102500/25=4100 bytes, or 5 packets (4 @1000 bytes, 1 @100),
283 // so packet count should be 5*250=1250 and last packet of each frame has
284 // 100 bytes of payload.
285 TestVideoSender(&sender, 9998, 1250, 100, 1025000);
287 TestVideoSender(&sender, 1, 0, 0, 0);
288 // 19998ms, 250 more frames.
289 TestVideoSender(&sender, 9999, 1250, 100, 1025000);
291 TestVideoSender(&sender, 1, 0, 0, 0);
292 // 20038ms, one more frame, as described above (25fps == 40ms/frame).
293 TestVideoSender(&sender, 39, 5, 100, 4100);
295 TestVideoSender(&sender, 1, 0, 0, 0);
298 TEST(BweTestFramework_VideoSenderTest, TestAppendInOrder) {
299 // 1 fps, 80 kbps, 250ms offset.
300 VideoSender sender1(1.0f, 80, 0x1234, 0.25f);
301 EXPECT_EQ(10000u, sender1.bytes_per_second());
303 // Generate some packets, verify they are sorted.
304 sender1.RunFor(999, &packets);
305 ASSERT_TRUE(IsTimeSorted(packets));
306 ASSERT_TRUE(IsSequenceNumberSorted(packets));
307 EXPECT_EQ(10u, packets.size());
308 // Generate some more packets and verify they are appended to end of list.
309 sender1.RunFor(1000, &packets);
310 ASSERT_TRUE(IsTimeSorted(packets));
311 ASSERT_TRUE(IsSequenceNumberSorted(packets));
312 EXPECT_EQ(20u, packets.size());
314 // Another sender, 2 fps, 160 kpbs, 150ms offset
315 VideoSender sender2(2.0f, 160, 0x2234, 0.30f);
316 EXPECT_EQ(20000u, sender2.bytes_per_second());
317 // Generate some packets, verify that they are merged with the packets already
319 sender2.RunFor(999, &packets);
320 ASSERT_TRUE(IsTimeSorted(packets));
321 EXPECT_EQ(40u, packets.size());
322 // Generate some more.
323 sender2.RunFor(1000, &packets);
324 ASSERT_TRUE(IsTimeSorted(packets));
325 EXPECT_EQ(60u, packets.size());
328 class BweTestFramework_RateCounterFilterTest : public ::testing::Test {
330 BweTestFramework_RateCounterFilterTest()
334 virtual ~BweTestFramework_RateCounterFilterTest() {}
337 void TestRateCounter(int64_t run_for_ms, uint32_t payload_bits,
338 uint32_t expected_pps, uint32_t expected_bps) {
340 RTPHeader header = {0};
341 // "Send" a packet every 10 ms.
342 for (int64_t i = 0; i < run_for_ms; i += 10, now_ms_ += 10) {
343 packets.push_back(BwePacket(now_ms_ * 1000, payload_bits / 8, header));
345 filter_.RunFor(run_for_ms, &packets);
346 ASSERT_TRUE(IsTimeSorted(packets));
347 EXPECT_EQ(expected_pps, filter_.packets_per_second());
348 EXPECT_EQ(expected_bps, filter_.bits_per_second());
352 RateCounterFilter filter_;
355 DISALLOW_COPY_AND_ASSIGN(BweTestFramework_RateCounterFilterTest);
358 TEST_F(BweTestFramework_RateCounterFilterTest, Short) {
359 // 100ms, 100 bytes per packet, should result in 10 pps and 8 kbps. We're
360 // generating one packet every 10 ms ; 10 * 800 = 8k
361 TestRateCounter(100, 800, 10, 8000);
364 TEST_F(BweTestFramework_RateCounterFilterTest, Medium) {
365 // 100ms, like above.
366 TestRateCounter(100, 800, 10, 8000);
367 // 1000ms, 100 bpp, should result in 100 pps and 80 kbps. We're still
368 // generating packets every 10 ms.
369 TestRateCounter(900, 800, 100, 80000);
372 TEST_F(BweTestFramework_RateCounterFilterTest, Long) {
373 // 100ms, 1000ms, like above.
374 TestRateCounter(100, 800, 10, 8000);
375 TestRateCounter(900, 800, 100, 80000);
376 // 2000ms, should only see rate of last second, so 100 pps, and 40 kbps now.
377 TestRateCounter(1000, 400, 100, 40000);
378 // 2500ms, half a second with zero payload size. We should get same pps as
379 // before, but kbps should drop to half of previous rate.
380 TestRateCounter(500, 0, 100, 20000);
381 // Another half second with zero payload size. Now the kbps rate should drop
383 TestRateCounter(500, 0, 100, 0);
384 // Increate payload size again. 200 * 100 * 0.5 = 10 kbps.
385 TestRateCounter(500, 200, 100, 10000);
388 static void TestLossFilter(float loss_percent, bool zero_tolerance) {
390 filter.SetLoss(loss_percent);
391 Packets::size_type sent_packets = 0;
392 Packets::size_type remaining_packets = 0;
394 // No input should yield no output
397 sent_packets += packets.size();
398 filter.RunFor(0, &packets);
399 ASSERT_TRUE(IsTimeSorted(packets));
400 ASSERT_TRUE(IsSequenceNumberSorted(packets));
401 remaining_packets += packets.size();
402 EXPECT_EQ(0u, sent_packets);
403 EXPECT_EQ(0u, remaining_packets);
406 // Generate and process 10000 packets in different batch sizes (some empty)
407 for (int i = 0; i < 2225; ++i) {
409 packets.insert(packets.end(), i % 10, BwePacket());
410 sent_packets += packets.size();
411 filter.RunFor(0, &packets);
412 ASSERT_TRUE(IsTimeSorted(packets));
413 ASSERT_TRUE(IsSequenceNumberSorted(packets));
414 remaining_packets += packets.size();
417 float loss_fraction = 0.01f * (100.0f - loss_percent);
418 Packets::size_type expected_packets = loss_fraction * sent_packets;
419 if (zero_tolerance) {
420 EXPECT_EQ(expected_packets, remaining_packets);
422 // Require within 1% of expected
423 EXPECT_NEAR(expected_packets, remaining_packets, 100);
427 TEST(BweTestFramework_LossFilterTest, Loss0) {
428 // With 0% loss, the result should be exact (no loss).
429 TestLossFilter(0.0f, true);
432 TEST(BweTestFramework_LossFilterTest, Loss10) {
433 TestLossFilter(10.0f, false);
436 TEST(BweTestFramework_LossFilterTest, Loss50) {
437 TestLossFilter(50.0f, false);
440 TEST(BweTestFramework_LossFilterTest, Loss100) {
441 // With 100% loss, the result should be exact (no packets out).
442 TestLossFilter(100.0f, true);
445 class BweTestFramework_DelayFilterTest : public ::testing::Test {
447 BweTestFramework_DelayFilterTest()
450 sequence_number_(0) {
452 virtual ~BweTestFramework_DelayFilterTest() {}
455 void TestDelayFilter(int64_t run_for_ms, uint32_t in_packets,
456 uint32_t out_packets) {
458 for (uint32_t i = 0; i < in_packets; ++i) {
459 packets.push_back(BwePacket(now_ms_ * 1000 + (sequence_number_ >> 4),
463 filter_.RunFor(run_for_ms, &packets);
464 ASSERT_TRUE(IsTimeSorted(packets));
465 ASSERT_TRUE(IsSequenceNumberSorted(packets));
466 for (PacketsConstIt it = packets.begin(); it != packets.end(); ++it) {
467 EXPECT_LE(now_ms_ * 1000, it->send_time_us());
469 EXPECT_EQ(out_packets, packets.size());
470 accumulated_packets_.splice(accumulated_packets_.end(), packets);
471 now_ms_ += run_for_ms;
474 void TestDelayFilter(int64_t delay_ms) {
475 filter_.SetDelay(delay_ms);
476 TestDelayFilter(1, 0, 0); // No input should yield no output
479 TestDelayFilter(0, 1, 1);
480 TestDelayFilter(delay_ms, 0, 0);
482 for (int i = 0; i < delay_ms; ++i) {
484 TestDelayFilter(1, 10, 10);
486 TestDelayFilter(0, 0, 0);
487 TestDelayFilter(delay_ms, 0, 0);
489 // Wait a little longer - should still see no output
490 TestDelayFilter(delay_ms, 0, 0);
492 for (int i = 1; i < delay_ms + 1; ++i) {
494 TestDelayFilter(1, 5, 5);
496 TestDelayFilter(0, 0, 0);
497 filter_.SetDelay(2 * delay_ms);
498 TestDelayFilter(1, 0, 0);
499 TestDelayFilter(delay_ms, 13, 13);
500 TestDelayFilter(delay_ms, 0, 0);
502 // Wait a little longer - should still see no output
503 TestDelayFilter(delay_ms, 0, 0);
505 for (int i = 0; i < 2 * delay_ms; ++i) {
506 filter_.SetDelay(2 * delay_ms - i - 1);
507 TestDelayFilter(1, 5, 5);
509 TestDelayFilter(0, 0, 0);
511 TestDelayFilter(0, 7, 7);
513 ASSERT_TRUE(IsTimeSorted(accumulated_packets_));
514 ASSERT_TRUE(IsSequenceNumberSorted(accumulated_packets_));
518 Packets accumulated_packets_;
522 uint32_t sequence_number_;
524 DISALLOW_COPY_AND_ASSIGN(BweTestFramework_DelayFilterTest);
527 TEST_F(BweTestFramework_DelayFilterTest, Delay0) {
528 TestDelayFilter(1, 0, 0); // No input should yield no output
529 TestDelayFilter(1, 10, 10); // Expect no delay (delay time is zero)
530 TestDelayFilter(1, 0, 0); // Check no packets are still in buffer
532 TestDelayFilter(1, 5, 5); // Expect no delay (delay time is zero)
533 TestDelayFilter(1, 0, 0); // Check no packets are still in buffer
536 TEST_F(BweTestFramework_DelayFilterTest, Delay1) {
540 TEST_F(BweTestFramework_DelayFilterTest, Delay2) {
544 TEST_F(BweTestFramework_DelayFilterTest, Delay20) {
548 TEST_F(BweTestFramework_DelayFilterTest, Delay100) {
549 TestDelayFilter(100);
552 TEST_F(BweTestFramework_DelayFilterTest, JumpToZeroDelay) {
557 // Delay a bunch of packets, accumulate them to the 'acc' list.
558 delay.SetDelay(100.0f);
559 for (uint32_t i = 0; i < 10; ++i) {
560 packets.push_back(BwePacket(i * 100, i));
562 delay.RunFor(1000, &packets);
563 acc.splice(acc.end(), packets);
564 ASSERT_TRUE(IsTimeSorted(acc));
565 ASSERT_TRUE(IsSequenceNumberSorted(acc));
567 // Drop delay to zero, send a few more packets through the delay, append them
568 // to the 'acc' list and verify that it is all sorted.
569 delay.SetDelay(0.0f);
570 for (uint32_t i = 10; i < 50; ++i) {
571 packets.push_back(BwePacket(i * 100, i));
573 delay.RunFor(1000, &packets);
574 acc.splice(acc.end(), packets);
575 ASSERT_TRUE(IsTimeSorted(acc));
576 ASSERT_TRUE(IsSequenceNumberSorted(acc));
579 TEST_F(BweTestFramework_DelayFilterTest, IncreasingDelay) {
580 // Gradually increase delay.
581 for (int i = 1; i < 50; i += 4) {
584 // Reach a steady state.
585 filter_.SetDelay(100);
586 TestDelayFilter(1, 20, 20);
587 TestDelayFilter(2, 0, 0);
588 TestDelayFilter(99, 20, 20);
589 // Drop delay back down to zero.
591 TestDelayFilter(1, 100, 100);
592 TestDelayFilter(23010, 0, 0);
593 ASSERT_TRUE(IsTimeSorted(accumulated_packets_));
594 ASSERT_TRUE(IsSequenceNumberSorted(accumulated_packets_));
597 static void TestJitterFilter(int64_t stddev_jitter_ms) {
599 filter.SetJitter(stddev_jitter_ms);
602 uint32_t sequence_number = 0;
604 // Generate packets, add jitter to them, accumulate the altered packets.
607 for (uint32_t i = 0; i < 1000; ++i) {
609 for (uint32_t j = 0; j < i % 100; ++j) {
610 packets.push_back(BwePacket(now_ms * 1000, sequence_number++));
611 now_ms += 5 * stddev_jitter_ms;
613 original.insert(original.end(), packets.begin(), packets.end());
614 filter.RunFor(stddev_jitter_ms, &packets);
615 jittered.splice(jittered.end(), packets);
618 // Jittered packets should still be in order.
619 ASSERT_TRUE(IsTimeSorted(original));
620 ASSERT_TRUE(IsTimeSorted(jittered));
621 ASSERT_TRUE(IsSequenceNumberSorted(original));
622 ASSERT_TRUE(IsSequenceNumberSorted(jittered));
623 EXPECT_EQ(original.size(), jittered.size());
625 // Make sure jittered and original packets are in same order. Collect time
626 // difference (jitter) in stats, then check that mean jitter is close to zero
627 // and standard deviation of jitter is what we set it to.
628 Stats<double> jitter_us;
629 for (PacketsIt it1 = original.begin(), it2 = jittered.begin();
630 it1 != original.end() && it2 != jittered.end(); ++it1, ++it2) {
631 EXPECT_EQ(it1->header().sequenceNumber, it2->header().sequenceNumber);
632 jitter_us.Push(it2->send_time_us() - it1->send_time_us());
634 EXPECT_NEAR(0.0, jitter_us.GetMean(), stddev_jitter_ms * 1000.0 * 0.008);
635 EXPECT_NEAR(stddev_jitter_ms * 1000.0, jitter_us.GetStdDev(),
636 stddev_jitter_ms * 1000.0 * 0.02);
639 TEST(BweTestFramework_JitterFilterTest, Jitter0) {
643 TEST(BweTestFramework_JitterFilterTest, Jitter1) {
647 TEST(BweTestFramework_JitterFilterTest, Jitter5) {
651 TEST(BweTestFramework_JitterFilterTest, Jitter10) {
652 TestJitterFilter(10);
655 TEST(BweTestFramework_JitterFilterTest, Jitter1031) {
656 TestJitterFilter(1031);
659 static void TestReorderFilter(uint32_t reorder_percent, uint32_t near) {
660 const uint32_t kPacketCount = 10000;
662 // Generate packets with 10 ms interval.
665 uint32_t sequence_number = 1;
666 for (uint32_t i = 0; i < kPacketCount; ++i, now_ms += 10) {
667 packets.push_back(BwePacket(now_ms * 1000, sequence_number++));
669 ASSERT_TRUE(IsTimeSorted(packets));
670 ASSERT_TRUE(IsSequenceNumberSorted(packets));
672 // Reorder packets, verify that send times are still in order.
673 ReorderFilter filter;
674 filter.SetReorder(reorder_percent);
675 filter.RunFor(now_ms, &packets);
676 ASSERT_TRUE(IsTimeSorted(packets));
678 // We measure the amount of reordering by summing the distance by which out-
679 // of-order packets have been moved in the stream.
680 uint32_t distance = 0;
681 uint32_t last_sequence_number = 0;
682 for (PacketsIt it = packets.begin(); it != packets.end(); ++it) {
683 uint32_t sequence_number = it->header().sequenceNumber;
684 if (sequence_number < last_sequence_number) {
685 distance += last_sequence_number - sequence_number;
687 last_sequence_number = sequence_number;
690 // Because reordering is random, we allow a threshold when comparing. The
691 // maximum distance a packet can be moved is PacketCount - 1.
692 EXPECT_NEAR(((kPacketCount - 1) * reorder_percent) / 100, distance, near);
695 TEST(BweTestFramework_ReorderFilterTest, Reorder0) {
696 // For 0% reordering, no packets should have been moved, so result is exact.
697 TestReorderFilter(0, 0);
700 TEST(BweTestFramework_ReorderFilterTest, Reorder10) {
701 TestReorderFilter(10, 30);
704 TEST(BweTestFramework_ReorderFilterTest, Reorder20) {
705 TestReorderFilter(20, 20);
708 TEST(BweTestFramework_ReorderFilterTest, Reorder50) {
709 TestReorderFilter(50, 20);
712 TEST(BweTestFramework_ReorderFilterTest, Reorder70) {
713 TestReorderFilter(70, 20);
716 TEST(BweTestFramework_ReorderFilterTest, Reorder100) {
717 // Note that because the implementation works by optionally swapping two
718 // adjacent packets, when the likelihood of a swap is 1.0, a swap will always
719 // occur, so the stream will be in order except for the first packet, which
720 // has been moved to the end. Therefore we expect the result to be exact here.
721 TestReorderFilter(100.0, 0);
724 class BweTestFramework_ChokeFilterTest : public ::testing::Test {
726 BweTestFramework_ChokeFilterTest()
733 virtual ~BweTestFramework_ChokeFilterTest() {}
738 void TestChoke(int64_t run_for_ms, uint32_t packets_to_generate,
739 uint32_t expected_kbit_transmitted) {
740 // Generate a bunch of packets, apply choke, verify output is ordered.
742 RTPHeader header = {0};
743 for (uint32_t i = 0; i < packets_to_generate; ++i) {
744 int64_t send_time_ms = now_ms_ + (i * run_for_ms) / packets_to_generate;
745 header.sequenceNumber = sequence_number_++;
746 // Payload is 1000 bits.
747 packets.push_back(BwePacket(send_time_ms * 1000, 125, header));
748 send_times_us_.push_back(send_time_ms * 1000);
750 ASSERT_TRUE(IsTimeSorted(packets));
751 filter_.RunFor(run_for_ms, &packets);
752 now_ms_ += run_for_ms;
753 output_packets_.splice(output_packets_.end(), packets);
754 ASSERT_TRUE(IsTimeSorted(output_packets_));
755 ASSERT_TRUE(IsSequenceNumberSorted(output_packets_));
757 // Sum up the transmitted bytes up until the current time.
758 uint32_t bytes_transmitted = 0;
759 while (!output_packets_.empty()) {
760 const BwePacket& packet = output_packets_.front();
761 if (packet.send_time_us() > now_ms_ * 1000) {
764 bytes_transmitted += packet.payload_size();
765 output_packets_.pop_front();
767 EXPECT_EQ(expected_kbit_transmitted, (bytes_transmitted * 8) / 1000);
770 void CheckMaxDelay(int64_t max_delay_ms) {
771 for (PacketsIt it = output_packets_.begin(); it != output_packets_.end();
773 const BwePacket& packet = *it;
774 int64_t delay_us = packet.send_time_us() -
775 send_times_us_[packet.header().sequenceNumber];
776 EXPECT_GE(max_delay_ms * 1000, delay_us);
782 uint32_t sequence_number_;
783 Packets output_packets_;
784 std::vector<int64_t> send_times_us_;
786 DISALLOW_COPY_AND_ASSIGN(BweTestFramework_ChokeFilterTest);
789 TEST_F(BweTestFramework_ChokeFilterTest, Short) {
790 // 100ms, 100 packets, 10 kbps choke -> 1 kbit of data should have propagated.
791 // That is actually just a single packet, since each packet has 1000 bits of
793 filter_.SetCapacity(10);
794 TestChoke(100, 100, 1);
797 TEST_F(BweTestFramework_ChokeFilterTest, Medium) {
798 // 100ms, 10 packets, 10 kbps choke -> 1 packet through, or 1 kbit.
799 filter_.SetCapacity(10);
800 TestChoke(100, 10, 1);
801 // 200ms, no new packets -> another packet through.
802 TestChoke(100, 0, 1);
803 // 1000ms, no new packets -> 8 more packets.
804 TestChoke(800, 0, 8);
805 // 2000ms, no new packets -> queue is empty so no output.
806 TestChoke(1000, 0, 0);
809 TEST_F(BweTestFramework_ChokeFilterTest, Long) {
810 // 100ms, 100 packets in queue, 10 kbps choke -> 1 packet through, or 1 kbit.
811 filter_.SetCapacity(10);
812 TestChoke(100, 100, 1);
813 // 200ms, no input, another packet through.
814 TestChoke(100, 0, 1);
815 // 1000ms, no input, 8 packets through.
816 TestChoke(800, 0, 8);
817 // 10000ms, no input, raise choke to 100 kbps. Remaining 90 packets in queue
818 // should be propagated, for a total of 90 kbps.
819 filter_.SetCapacity(100);
820 TestChoke(9000, 0, 90);
821 // 10100ms, 20 more packets -> 10 packets or 10 kbit through.
822 TestChoke(100, 20, 10);
823 // 10300ms, 10 more packets -> 20 packets out.
824 TestChoke(200, 10, 20);
825 // 11300ms, no input, queue should be empty.
826 filter_.SetCapacity(10);
827 TestChoke(1000, 0, 0);
830 TEST_F(BweTestFramework_ChokeFilterTest, MaxDelay) {
831 // 10 kbps choke, 500 ms delay cap
832 filter_.SetCapacity(10);
833 filter_.SetMaxDelay(500);
834 // 100ms, 100 packets in queue, 10 kbps choke -> 1 packet through, or 1 kbit.
835 TestChoke(100, 100, 1);
837 // 500ms, no input, 4 more packets through.
838 TestChoke(400, 0, 4);
839 // 10000ms, no input, remaining packets should have been dropped.
840 TestChoke(9500, 0, 0);
843 filter_.SetMaxDelay(100);
844 // 10100ms, 50 more packets -> 2 packets or 2 kbit through.
845 TestChoke(100, 50, 2);
847 // 20000ms, no input, remaining packets in queue should have been dropped.
848 TestChoke(9900, 0, 0);
850 // Reset delay cap (0 is no cap) and verify no packets are dropped.
851 filter_.SetCapacity(10);
852 filter_.SetMaxDelay(0);
853 TestChoke(100, 100, 2);
854 TestChoke(9900, 0, 98);
857 } // namespace testing
858 } // namespace webrtc