blob: 2187282cd3fd406b6118abe2c9a5bd09bda82cee [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
11#include "webrtc/base/gunit.h"
12#include "webrtc/base/ratetracker.h"
13
14namespace rtc {
15
16class RateTrackerForTest : public RateTracker {
17 public:
Tim Psiaki63046262015-09-14 10:38:08 -070018 RateTrackerForTest() : RateTracker(100u, 10u), time_(0) {}
Peter Boström0c4e06b2015-10-07 12:23:21 +020019 virtual uint32_t Time() const { return time_; }
20 void AdvanceTime(uint32_t delta) { time_ += delta; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000021
22 private:
Peter Boström0c4e06b2015-10-07 12:23:21 +020023 uint32_t time_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000024};
25
Tim Psiaki63046262015-09-14 10:38:08 -070026TEST(RateTrackerTest, Test30FPS) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000027 RateTrackerForTest tracker;
Tim Psiaki63046262015-09-14 10:38:08 -070028
29 for (int i = 0; i < 300; ++i) {
30 tracker.AddSamples(1);
31 tracker.AdvanceTime(33);
32 if (i % 3 == 0) {
33 tracker.AdvanceTime(1);
34 }
35 }
36 EXPECT_DOUBLE_EQ(30.0, tracker.ComputeRateForInterval(50000u));
37}
38
39TEST(RateTrackerTest, Test60FPS) {
40 RateTrackerForTest tracker;
41
42 for (int i = 0; i < 300; ++i) {
43 tracker.AddSamples(1);
44 tracker.AdvanceTime(16);
45 if (i % 3 != 0) {
46 tracker.AdvanceTime(1);
47 }
48 }
49 EXPECT_DOUBLE_EQ(60.0, tracker.ComputeRateForInterval(1000u));
50}
51
52TEST(RateTrackerTest, TestRateTrackerBasics) {
53 RateTrackerForTest tracker;
54 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000u));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000055
56 // Add a sample.
Tim Psiaki63046262015-09-14 10:38:08 -070057 tracker.AddSamples(1234);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000058 // Advance the clock by 100 ms.
59 tracker.AdvanceTime(100);
Tim Psiaki63046262015-09-14 10:38:08 -070060 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000u));
61 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate());
62 EXPECT_EQ(1234U, tracker.TotalSampleCount());
63 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000064
65 // Repeat.
Tim Psiaki63046262015-09-14 10:38:08 -070066 tracker.AddSamples(1234);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000067 tracker.AdvanceTime(100);
Tim Psiaki63046262015-09-14 10:38:08 -070068 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000u));
69 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate());
70 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
71 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000072
73 // Advance the clock by 800 ms, so we've elapsed a full second.
74 // units_second should now be filled in properly.
75 tracker.AdvanceTime(800);
Tim Psiaki63046262015-09-14 10:38:08 -070076 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000u));
77 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate());
78 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
79 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000080
81 // Poll the tracker again immediately. The reported rate should stay the same.
Tim Psiaki63046262015-09-14 10:38:08 -070082 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000u));
83 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate());
84 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
85 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086
87 // Do nothing and advance by a second. We should drop down to zero.
88 tracker.AdvanceTime(1000);
Tim Psiaki63046262015-09-14 10:38:08 -070089 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000u));
90 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate());
91 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
92 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000093
94 // Send a bunch of data at a constant rate for 5.5 "seconds".
95 // We should report the rate properly.
96 for (int i = 0; i < 5500; i += 100) {
Tim Psiaki63046262015-09-14 10:38:08 -070097 tracker.AddSamples(9876U);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000098 tracker.AdvanceTime(100);
99 }
Tim Psiaki63046262015-09-14 10:38:08 -0700100 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRateForInterval(1000u));
101 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRate());
102 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount());
103 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 7.5,
104 tracker.ComputeTotalRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105
106 // Advance the clock by 500 ms. Since we sent nothing over this half-second,
107 // the reported rate should be reduced by half.
108 tracker.AdvanceTime(500);
Tim Psiaki63046262015-09-14 10:38:08 -0700109 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRateForInterval(1000u));
110 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRate());
111 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount());
112 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 8.0,
113 tracker.ComputeTotalRate());
114
115 // Rate over the last half second should be zero.
116 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(500u));
117}
118
119TEST(RateTrackerTest, TestLongPeriodBetweenSamples) {
120 RateTrackerForTest tracker;
121 tracker.AddSamples(1);
122 tracker.AdvanceTime(1000);
123 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate());
124
125 tracker.AdvanceTime(2000);
126 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate());
127
128 tracker.AdvanceTime(2000);
129 tracker.AddSamples(1);
130 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate());
131}
132
133TEST(RateTrackerTest, TestRolloff) {
134 RateTrackerForTest tracker;
135 for (int i = 0; i < 10; ++i) {
136 tracker.AddSamples(1U);
137 tracker.AdvanceTime(100);
138 }
139 EXPECT_DOUBLE_EQ(10.0, tracker.ComputeRate());
140
141 for (int i = 0; i < 10; ++i) {
142 tracker.AddSamples(1U);
143 tracker.AdvanceTime(50);
144 }
145 EXPECT_DOUBLE_EQ(15.0, tracker.ComputeRate());
146 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRateForInterval(500u));
147
148 for (int i = 0; i < 10; ++i) {
149 tracker.AddSamples(1U);
150 tracker.AdvanceTime(50);
151 }
152 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRate());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000153}
154
perkj@webrtc.orga78a94e2015-03-17 12:45:15 +0000155TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) {
156 RateTrackerForTest tracker;
Tim Psiaki63046262015-09-14 10:38:08 -0700157 tracker.AddSamples(1234);
perkj@webrtc.orga78a94e2015-03-17 12:45:15 +0000158 tracker.AdvanceTime(1000);
Tim Psiaki63046262015-09-14 10:38:08 -0700159 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeRateForInterval(1000u));
perkj@webrtc.orga78a94e2015-03-17 12:45:15 +0000160}
161
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000162} // namespace rtc