blob: 1770ac51a37b3b3b2f6c65b99a61e4f512af535e [file] [log] [blame]
stefan@webrtc.org82462aa2014-10-23 11:57:05 +00001/*
2 * Copyright (c) 2014 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/pacing/bitrate_prober.h"
12#include "test/gtest.h"
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000013
14namespace webrtc {
15
16TEST(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) {
17 BitrateProber prober;
18 EXPECT_FALSE(prober.IsProbing());
19 int64_t now_ms = 0;
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +000020 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000021
sergeyu6dbbd892017-01-17 15:07:59 -080022 const int kTestBitrate1 = 900000;
23 const int kTestBitrate2 = 1800000;
24 const int kClusterSize = 5;
25 const int kProbeSize = 1000;
26 const int kMinProbeDurationMs = 15;
27
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -080028 prober.CreateProbeCluster(kTestBitrate1, now_ms, 0);
29 prober.CreateProbeCluster(kTestBitrate2, now_ms, 1);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000030 EXPECT_FALSE(prober.IsProbing());
31
sergeyu6dbbd892017-01-17 15:07:59 -080032 prober.OnIncomingPacket(kProbeSize);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000033 EXPECT_TRUE(prober.IsProbing());
philipelc7bf32a2017-02-17 03:59:43 -080034 EXPECT_EQ(0, prober.CurrentCluster().probe_cluster_id);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000035
Peter Boström0453ef82016-02-16 16:23:08 +010036 // First packet should probe as soon as possible.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000037 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000038
sergeyu6dbbd892017-01-17 15:07:59 -080039 for (int i = 0; i < kClusterSize; ++i) {
40 now_ms += prober.TimeUntilNextProbe(now_ms);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000041 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
philipelc7bf32a2017-02-17 03:59:43 -080042 EXPECT_EQ(0, prober.CurrentCluster().probe_cluster_id);
sergeyu6dbbd892017-01-17 15:07:59 -080043 prober.ProbeSent(now_ms, kProbeSize);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000044 }
sergeyu6dbbd892017-01-17 15:07:59 -080045
46 EXPECT_GE(now_ms, kMinProbeDurationMs);
47 // Verify that the actual bitrate is withing 10% of the target.
48 double bitrate = kProbeSize * (kClusterSize - 1) * 8 * 1000.0 / now_ms;
49 EXPECT_GT(bitrate, kTestBitrate1 * 0.9);
Yves Gerey665174f2018-06-19 15:03:05 +020050 EXPECT_LT(bitrate, kTestBitrate1 * 1.1);
sergeyu6dbbd892017-01-17 15:07:59 -080051
52 now_ms += prober.TimeUntilNextProbe(now_ms);
53 int64_t probe2_started = now_ms;
54
55 for (int i = 0; i < kClusterSize; ++i) {
56 now_ms += prober.TimeUntilNextProbe(now_ms);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000057 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
philipelc7bf32a2017-02-17 03:59:43 -080058 EXPECT_EQ(1, prober.CurrentCluster().probe_cluster_id);
sergeyu6dbbd892017-01-17 15:07:59 -080059 prober.ProbeSent(now_ms, kProbeSize);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000060 }
61
sergeyu6dbbd892017-01-17 15:07:59 -080062 // Verify that the actual bitrate is withing 10% of the target.
63 int duration = now_ms - probe2_started;
64 EXPECT_GE(duration, kMinProbeDurationMs);
65 bitrate = kProbeSize * (kClusterSize - 1) * 8 * 1000.0 / duration;
66 EXPECT_GT(bitrate, kTestBitrate2 * 0.9);
Yves Gerey665174f2018-06-19 15:03:05 +020067 EXPECT_LT(bitrate, kTestBitrate2 * 1.1);
sergeyu6dbbd892017-01-17 15:07:59 -080068
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +000069 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000070 EXPECT_FALSE(prober.IsProbing());
71}
Peter Boström0453ef82016-02-16 16:23:08 +010072
73TEST(BitrateProberTest, DoesntProbeWithoutRecentPackets) {
74 BitrateProber prober;
75 EXPECT_FALSE(prober.IsProbing());
76 int64_t now_ms = 0;
77 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
78
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -080079 prober.CreateProbeCluster(900000, now_ms, 0);
Peter Boström0453ef82016-02-16 16:23:08 +010080 EXPECT_FALSE(prober.IsProbing());
81
philipel4a1ec1e2016-08-15 11:51:06 -070082 prober.OnIncomingPacket(1000);
Peter Boström0453ef82016-02-16 16:23:08 +010083 EXPECT_TRUE(prober.IsProbing());
84 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
isheriffcc5903e2016-10-04 08:29:38 -070085 prober.ProbeSent(now_ms, 1000);
Peter Boström0453ef82016-02-16 16:23:08 +010086 // Let time pass, no large enough packets put into prober.
87 now_ms += 6000;
88 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
srteadf4c162017-12-07 11:27:03 +010089 // Check that legacy behaviour where prober is reset in TimeUntilNextProbe is
90 // no longer there. Probes are no longer retried if they are timed out.
philipel4a1ec1e2016-08-15 11:51:06 -070091 prober.OnIncomingPacket(1000);
srteadf4c162017-12-07 11:27:03 +010092 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
Peter Boström0453ef82016-02-16 16:23:08 +010093}
94
95TEST(BitrateProberTest, DoesntInitializeProbingForSmallPackets) {
96 BitrateProber prober;
97 prober.SetEnabled(true);
98 EXPECT_FALSE(prober.IsProbing());
99
philipel4a1ec1e2016-08-15 11:51:06 -0700100 prober.OnIncomingPacket(100);
Peter Boström0453ef82016-02-16 16:23:08 +0100101 EXPECT_FALSE(prober.IsProbing());
102}
103
isheriffcc5903e2016-10-04 08:29:38 -0700104TEST(BitrateProberTest, VerifyProbeSizeOnHighBitrate) {
105 BitrateProber prober;
106 constexpr unsigned kHighBitrateBps = 10000000; // 10 Mbps
107
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -0800108 prober.CreateProbeCluster(kHighBitrateBps, 0, /*cluster_id=*/0);
isheriffcc5903e2016-10-04 08:29:38 -0700109 // Probe size should ensure a minimum of 1 ms interval.
110 EXPECT_GT(prober.RecommendedMinProbeSize(), kHighBitrateBps / 8000);
111}
112
philipelfd58b612017-01-04 07:05:25 -0800113TEST(BitrateProberTest, MinumumNumberOfProbingPackets) {
114 BitrateProber prober;
115 // Even when probing at a low bitrate we expect a minimum number
116 // of packets to be sent.
117 constexpr int kBitrateBps = 100000; // 100 kbps
118 constexpr int kPacketSizeBytes = 1000;
119
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -0800120 prober.CreateProbeCluster(kBitrateBps, 0, 0);
philipelfd58b612017-01-04 07:05:25 -0800121 prober.OnIncomingPacket(kPacketSizeBytes);
122 for (int i = 0; i < 5; ++i) {
123 EXPECT_TRUE(prober.IsProbing());
124 prober.ProbeSent(0, kPacketSizeBytes);
125 }
126
127 EXPECT_FALSE(prober.IsProbing());
128}
129
130TEST(BitrateProberTest, ScaleBytesUsedForProbing) {
131 BitrateProber prober;
132 constexpr int kBitrateBps = 10000000; // 10 Mbps
133 constexpr int kPacketSizeBytes = 1000;
134 constexpr int kExpectedBytesSent = kBitrateBps * 15 / 8000;
135
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -0800136 prober.CreateProbeCluster(kBitrateBps, 0, /*cluster_id=*/0);
philipelfd58b612017-01-04 07:05:25 -0800137 prober.OnIncomingPacket(kPacketSizeBytes);
138 int bytes_sent = 0;
139 while (bytes_sent < kExpectedBytesSent) {
stefanf00497c2017-01-27 02:27:33 -0800140 ASSERT_TRUE(prober.IsProbing());
philipelfd58b612017-01-04 07:05:25 -0800141 prober.ProbeSent(0, kPacketSizeBytes);
142 bytes_sent += kPacketSizeBytes;
143 }
144
145 EXPECT_FALSE(prober.IsProbing());
146}
147
Johannes Kron85846672018-11-09 12:39:38 +0100148TEST(BitrateProberTest, HighBitrateProbing) {
149 BitrateProber prober;
150 constexpr int kBitrateBps = 1000000000; // 1 Gbps.
151 constexpr int kPacketSizeBytes = 1000;
152 constexpr int kExpectedBytesSent = (kBitrateBps / 8000) * 15;
153
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -0800154 prober.CreateProbeCluster(kBitrateBps, 0, 0);
Johannes Kron85846672018-11-09 12:39:38 +0100155 prober.OnIncomingPacket(kPacketSizeBytes);
156 int bytes_sent = 0;
157 while (bytes_sent < kExpectedBytesSent) {
158 ASSERT_TRUE(prober.IsProbing());
159 prober.ProbeSent(0, kPacketSizeBytes);
160 bytes_sent += kPacketSizeBytes;
161 }
162
163 EXPECT_FALSE(prober.IsProbing());
164}
165
Stefan Holmer0e3213a2017-02-08 15:19:05 +0100166TEST(BitrateProberTest, ProbeClusterTimeout) {
167 BitrateProber prober;
168 constexpr int kBitrateBps = 300000; // 300 kbps
169 constexpr int kSmallPacketSize = 20;
170 // Expecting two probe clusters of 5 packets each.
171 constexpr int kExpectedBytesSent = 20 * 2 * 5;
172 constexpr int64_t kTimeoutMs = 5000;
173
174 int64_t now_ms = 0;
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -0800175 prober.CreateProbeCluster(kBitrateBps, now_ms, /*cluster_id=*/0);
Stefan Holmer0e3213a2017-02-08 15:19:05 +0100176 prober.OnIncomingPacket(kSmallPacketSize);
177 EXPECT_FALSE(prober.IsProbing());
178 now_ms += kTimeoutMs;
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -0800179 prober.CreateProbeCluster(kBitrateBps / 10, now_ms, /*cluster_id=*/1);
Stefan Holmer0e3213a2017-02-08 15:19:05 +0100180 prober.OnIncomingPacket(kSmallPacketSize);
181 EXPECT_FALSE(prober.IsProbing());
182 now_ms += 1;
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -0800183 prober.CreateProbeCluster(kBitrateBps / 10, now_ms, /*cluster_id=*/2);
Stefan Holmer0e3213a2017-02-08 15:19:05 +0100184 prober.OnIncomingPacket(kSmallPacketSize);
185 EXPECT_TRUE(prober.IsProbing());
186 int bytes_sent = 0;
187 while (bytes_sent < kExpectedBytesSent) {
188 ASSERT_TRUE(prober.IsProbing());
189 prober.ProbeSent(0, kSmallPacketSize);
190 bytes_sent += kSmallPacketSize;
191 }
192
193 EXPECT_FALSE(prober.IsProbing());
194}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000195} // namespace webrtc