blob: 7a2c1ad73b8e2e20919cf9b1370ea2e18e132f81 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:261/*
Tim Psiaki63046262015-09-14 17:38:082 * Copyright 2015 The WebRTC Project Authors. All rights reserved.
henrike@webrtc.orgf0488722014-05-13 18:00:263 *
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
Steve Anton10542f22019-01-11 17:11:0011#include "rtc_base/rate_tracker.h"
Yves Gerey3e707812018-11-28 15:47:4912
13#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:2614
15namespace rtc {
asapersson799379e2016-02-02 09:46:5316namespace {
Yves Gerey665174f2018-06-19 13:03:0517const uint32_t kBucketIntervalMs = 100;
asapersson799379e2016-02-02 09:46:5318} // namespace
henrike@webrtc.orgf0488722014-05-13 18:00:2619
20class RateTrackerForTest : public RateTracker {
21 public:
asapersson799379e2016-02-02 09:46:5322 RateTrackerForTest() : RateTracker(kBucketIntervalMs, 10u), time_(0) {}
ehmaldonadoda8dcfb2017-01-04 15:11:2323 int64_t Time() const override { return time_; }
Honghai Zhang82d78622016-05-06 18:29:1524 void AdvanceTime(int delta) { time_ += delta; }
henrike@webrtc.orgf0488722014-05-13 18:00:2625
26 private:
Honghai Zhang82d78622016-05-06 18:29:1527 int64_t time_;
henrike@webrtc.orgf0488722014-05-13 18:00:2628};
29
Tim Psiaki63046262015-09-14 17:38:0830TEST(RateTrackerTest, Test30FPS) {
henrike@webrtc.orgf0488722014-05-13 18:00:2631 RateTrackerForTest tracker;
Tim Psiaki63046262015-09-14 17:38:0832
33 for (int i = 0; i < 300; ++i) {
34 tracker.AddSamples(1);
35 tracker.AdvanceTime(33);
36 if (i % 3 == 0) {
37 tracker.AdvanceTime(1);
38 }
39 }
Honghai Zhang82d78622016-05-06 18:29:1540 EXPECT_DOUBLE_EQ(30.0, tracker.ComputeRateForInterval(50000));
Tim Psiaki63046262015-09-14 17:38:0841}
42
43TEST(RateTrackerTest, Test60FPS) {
44 RateTrackerForTest tracker;
45
46 for (int i = 0; i < 300; ++i) {
47 tracker.AddSamples(1);
48 tracker.AdvanceTime(16);
49 if (i % 3 != 0) {
50 tracker.AdvanceTime(1);
51 }
52 }
Honghai Zhang82d78622016-05-06 18:29:1553 EXPECT_DOUBLE_EQ(60.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 17:38:0854}
55
56TEST(RateTrackerTest, TestRateTrackerBasics) {
57 RateTrackerForTest tracker;
Honghai Zhang82d78622016-05-06 18:29:1558 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000));
henrike@webrtc.orgf0488722014-05-13 18:00:2659
60 // Add a sample.
Tim Psiaki63046262015-09-14 17:38:0861 tracker.AddSamples(1234);
asapersson799379e2016-02-02 09:46:5362 // Advance the clock by less than one bucket interval (no rate returned).
63 tracker.AdvanceTime(kBucketIntervalMs - 1);
64 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate());
65 // Advance the clock by 100 ms (one bucket interval).
66 tracker.AdvanceTime(1);
Honghai Zhang82d78622016-05-06 18:29:1567 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 17:38:0868 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate());
69 EXPECT_EQ(1234U, tracker.TotalSampleCount());
70 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:2671
72 // Repeat.
Tim Psiaki63046262015-09-14 17:38:0873 tracker.AddSamples(1234);
henrike@webrtc.orgf0488722014-05-13 18:00:2674 tracker.AdvanceTime(100);
Honghai Zhang82d78622016-05-06 18:29:1575 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 17:38:0876 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate());
77 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
78 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:2679
80 // Advance the clock by 800 ms, so we've elapsed a full second.
81 // units_second should now be filled in properly.
82 tracker.AdvanceTime(800);
Honghai Zhang82d78622016-05-06 18:29:1583 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 17:38:0884 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate());
85 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
86 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:2687
88 // Poll the tracker again immediately. The reported rate should stay the same.
Honghai Zhang82d78622016-05-06 18:29:1589 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 17:38:0890 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate());
91 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
92 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:2693
94 // Do nothing and advance by a second. We should drop down to zero.
95 tracker.AdvanceTime(1000);
Honghai Zhang82d78622016-05-06 18:29:1596 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 17:38:0897 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate());
98 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
99 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26100
101 // Send a bunch of data at a constant rate for 5.5 "seconds".
102 // We should report the rate properly.
103 for (int i = 0; i < 5500; i += 100) {
Tim Psiaki63046262015-09-14 17:38:08104 tracker.AddSamples(9876U);
henrike@webrtc.orgf0488722014-05-13 18:00:26105 tracker.AdvanceTime(100);
106 }
Honghai Zhang82d78622016-05-06 18:29:15107 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 17:38:08108 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRate());
109 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount());
110 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 7.5,
Yves Gerey665174f2018-06-19 13:03:05111 tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26112
113 // Advance the clock by 500 ms. Since we sent nothing over this half-second,
114 // the reported rate should be reduced by half.
115 tracker.AdvanceTime(500);
Honghai Zhang82d78622016-05-06 18:29:15116 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 17:38:08117 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRate());
118 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount());
119 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 8.0,
Yves Gerey665174f2018-06-19 13:03:05120 tracker.ComputeTotalRate());
Tim Psiaki63046262015-09-14 17:38:08121
122 // Rate over the last half second should be zero.
Honghai Zhang82d78622016-05-06 18:29:15123 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(500));
Tim Psiaki63046262015-09-14 17:38:08124}
125
126TEST(RateTrackerTest, TestLongPeriodBetweenSamples) {
127 RateTrackerForTest tracker;
128 tracker.AddSamples(1);
129 tracker.AdvanceTime(1000);
130 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate());
131
132 tracker.AdvanceTime(2000);
133 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate());
134
135 tracker.AdvanceTime(2000);
136 tracker.AddSamples(1);
137 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate());
138}
139
140TEST(RateTrackerTest, TestRolloff) {
141 RateTrackerForTest tracker;
142 for (int i = 0; i < 10; ++i) {
143 tracker.AddSamples(1U);
144 tracker.AdvanceTime(100);
145 }
146 EXPECT_DOUBLE_EQ(10.0, tracker.ComputeRate());
147
148 for (int i = 0; i < 10; ++i) {
149 tracker.AddSamples(1U);
150 tracker.AdvanceTime(50);
151 }
152 EXPECT_DOUBLE_EQ(15.0, tracker.ComputeRate());
Honghai Zhang82d78622016-05-06 18:29:15153 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRateForInterval(500));
Tim Psiaki63046262015-09-14 17:38:08154
155 for (int i = 0; i < 10; ++i) {
156 tracker.AddSamples(1U);
157 tracker.AdvanceTime(50);
158 }
159 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26160}
161
perkj@webrtc.orga78a94e2015-03-17 12:45:15162TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) {
163 RateTrackerForTest tracker;
Tim Psiaki63046262015-09-14 17:38:08164 tracker.AddSamples(1234);
perkj@webrtc.orga78a94e2015-03-17 12:45:15165 tracker.AdvanceTime(1000);
Honghai Zhang82d78622016-05-06 18:29:15166 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeRateForInterval(1000));
perkj@webrtc.orga78a94e2015-03-17 12:45:15167}
168
henrike@webrtc.orgf0488722014-05-13 18:00:26169} // namespace rtc