blob: ce63781e6871b01604e3eef4344a5d9bf9f57582 [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
11#include <limits>
12
13#include "testing/gtest/include/gtest/gtest.h"
14#include "webrtc/modules/pacing/bitrate_prober.h"
15
16namespace webrtc {
17
18TEST(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) {
19 BitrateProber prober;
20 EXPECT_FALSE(prober.IsProbing());
21 int64_t now_ms = 0;
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +000022 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000023
24 prober.SetEnabled(true);
25 EXPECT_FALSE(prober.IsProbing());
26
Peter Boström0453ef82016-02-16 16:23:08 +010027 prober.OnIncomingPacket(300000, 1000, now_ms);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000028 EXPECT_TRUE(prober.IsProbing());
philipeldd324862016-05-06 17:06:14 +020029 EXPECT_EQ(0, prober.CurrentClusterId());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000030
Peter Boström0453ef82016-02-16 16:23:08 +010031 // First packet should probe as soon as possible.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000032 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
33 prober.PacketSent(now_ms, 1000);
34
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000035 for (int i = 0; i < 5; ++i) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +000036 EXPECT_EQ(8, prober.TimeUntilNextProbe(now_ms));
37 now_ms += 4;
38 EXPECT_EQ(4, prober.TimeUntilNextProbe(now_ms));
39 now_ms += 4;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000040 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
philipeldd324862016-05-06 17:06:14 +020041 EXPECT_EQ(0, prober.CurrentClusterId());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000042 prober.PacketSent(now_ms, 1000);
43 }
44 for (int i = 0; i < 5; ++i) {
45 EXPECT_EQ(4, prober.TimeUntilNextProbe(now_ms));
46 now_ms += 4;
47 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
philipeldd324862016-05-06 17:06:14 +020048 EXPECT_EQ(1, prober.CurrentClusterId());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000049 prober.PacketSent(now_ms, 1000);
50 }
51
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +000052 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000053 EXPECT_FALSE(prober.IsProbing());
54}
Peter Boström0453ef82016-02-16 16:23:08 +010055
56TEST(BitrateProberTest, DoesntProbeWithoutRecentPackets) {
57 BitrateProber prober;
58 EXPECT_FALSE(prober.IsProbing());
59 int64_t now_ms = 0;
60 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
61
62 prober.SetEnabled(true);
63 EXPECT_FALSE(prober.IsProbing());
64
65 prober.OnIncomingPacket(300000, 1000, now_ms);
66 EXPECT_TRUE(prober.IsProbing());
67 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
Irfan Sheriff6e11efa2016-08-02 12:57:37 -070068 prober.PacketSent(now_ms, 1000);
Peter Boström0453ef82016-02-16 16:23:08 +010069 // Let time pass, no large enough packets put into prober.
70 now_ms += 6000;
71 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
72 // Insert a small packet, not a candidate for probing.
73 prober.OnIncomingPacket(300000, 100, now_ms);
74 prober.PacketSent(now_ms, 100);
75 EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
76 // Insert a large-enough packet after downtime while probing should reset to
77 // perform a new probe since the requested one didn't finish.
78 prober.OnIncomingPacket(300000, 1000, now_ms);
79 EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
80 prober.PacketSent(now_ms, 1000);
81 // Next packet should be part of new probe and be sent with non-zero delay.
82 prober.OnIncomingPacket(300000, 1000, now_ms);
83 EXPECT_GT(prober.TimeUntilNextProbe(now_ms), 0);
84}
85
86TEST(BitrateProberTest, DoesntInitializeProbingForSmallPackets) {
87 BitrateProber prober;
88 prober.SetEnabled(true);
89 EXPECT_FALSE(prober.IsProbing());
90
91 prober.OnIncomingPacket(300000, 100, 0);
92 EXPECT_FALSE(prober.IsProbing());
93}
94
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000095} // namespace webrtc