blob: 7a2c1ad73b8e2e20919cf9b1370ea2e18e132f81 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
Tim Psiaki63046262015-09-14 10:38:08 -07002 * Copyright 2015 The WebRTC Project Authors. All rights reserved.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00003 *
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 09:11:00 -080011#include "rtc_base/rate_tracker.h"
Yves Gerey3e707812018-11-28 16:47:49 +010012
13#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000014
15namespace rtc {
asapersson799379e2016-02-02 01:46:53 -080016namespace {
Yves Gerey665174f2018-06-19 15:03:05 +020017const uint32_t kBucketIntervalMs = 100;
asapersson799379e2016-02-02 01:46:53 -080018} // namespace
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000019
20class RateTrackerForTest : public RateTracker {
21 public:
asapersson799379e2016-02-02 01:46:53 -080022 RateTrackerForTest() : RateTracker(kBucketIntervalMs, 10u), time_(0) {}
ehmaldonadoda8dcfb2017-01-04 07:11:23 -080023 int64_t Time() const override { return time_; }
Honghai Zhang82d78622016-05-06 11:29:15 -070024 void AdvanceTime(int delta) { time_ += delta; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000025
26 private:
Honghai Zhang82d78622016-05-06 11:29:15 -070027 int64_t time_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000028};
29
Tim Psiaki63046262015-09-14 10:38:08 -070030TEST(RateTrackerTest, Test30FPS) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000031 RateTrackerForTest tracker;
Tim Psiaki63046262015-09-14 10:38:08 -070032
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 11:29:15 -070040 EXPECT_DOUBLE_EQ(30.0, tracker.ComputeRateForInterval(50000));
Tim Psiaki63046262015-09-14 10:38:08 -070041}
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 11:29:15 -070053 EXPECT_DOUBLE_EQ(60.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 10:38:08 -070054}
55
56TEST(RateTrackerTest, TestRateTrackerBasics) {
57 RateTrackerForTest tracker;
Honghai Zhang82d78622016-05-06 11:29:15 -070058 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000059
60 // Add a sample.
Tim Psiaki63046262015-09-14 10:38:08 -070061 tracker.AddSamples(1234);
asapersson799379e2016-02-02 01:46:53 -080062 // 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 11:29:15 -070067 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 10:38:08 -070068 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:26 +000071
72 // Repeat.
Tim Psiaki63046262015-09-14 10:38:08 -070073 tracker.AddSamples(1234);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000074 tracker.AdvanceTime(100);
Honghai Zhang82d78622016-05-06 11:29:15 -070075 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 10:38:08 -070076 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:26 +000079
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 11:29:15 -070083 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 10:38:08 -070084 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:26 +000087
88 // Poll the tracker again immediately. The reported rate should stay the same.
Honghai Zhang82d78622016-05-06 11:29:15 -070089 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 10:38:08 -070090 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:26 +000093
94 // Do nothing and advance by a second. We should drop down to zero.
95 tracker.AdvanceTime(1000);
Honghai Zhang82d78622016-05-06 11:29:15 -070096 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 10:38:08 -070097 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:26 +0000100
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 10:38:08 -0700104 tracker.AddSamples(9876U);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105 tracker.AdvanceTime(100);
106 }
Honghai Zhang82d78622016-05-06 11:29:15 -0700107 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 10:38:08 -0700108 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 15:03:05 +0200111 tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000112
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 11:29:15 -0700116 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRateForInterval(1000));
Tim Psiaki63046262015-09-14 10:38:08 -0700117 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 15:03:05 +0200120 tracker.ComputeTotalRate());
Tim Psiaki63046262015-09-14 10:38:08 -0700121
122 // Rate over the last half second should be zero.
Honghai Zhang82d78622016-05-06 11:29:15 -0700123 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(500));
Tim Psiaki63046262015-09-14 10:38:08 -0700124}
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 11:29:15 -0700153 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRateForInterval(500));
Tim Psiaki63046262015-09-14 10:38:08 -0700154
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:26 +0000160}
161
perkj@webrtc.orga78a94e2015-03-17 12:45:15 +0000162TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) {
163 RateTrackerForTest tracker;
Tim Psiaki63046262015-09-14 10:38:08 -0700164 tracker.AddSamples(1234);
perkj@webrtc.orga78a94e2015-03-17 12:45:15 +0000165 tracker.AdvanceTime(1000);
Honghai Zhang82d78622016-05-06 11:29:15 -0700166 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeRateForInterval(1000));
perkj@webrtc.orga78a94e2015-03-17 12:45:15 +0000167}
168
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000169} // namespace rtc