OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/base/gunit.h" | 11 #include "webrtc/base/gunit.h" |
12 #include "webrtc/base/ratetracker.h" | 12 #include "webrtc/base/ratetracker.h" |
13 | 13 |
14 namespace rtc { | 14 namespace rtc { |
15 namespace { | 15 namespace { |
16 const uint32_t kBucketIntervalMs = 100; | 16 const uint32_t kBucketIntervalMs = 100; |
17 } // namespace | 17 } // namespace |
18 | 18 |
19 class RateTrackerForTest : public RateTracker { | 19 class RateTrackerForTest : public RateTracker { |
20 public: | 20 public: |
21 RateTrackerForTest() : RateTracker(kBucketIntervalMs, 10u), time_(0) {} | 21 RateTrackerForTest() : RateTracker(kBucketIntervalMs, 10u), time_(0) {} |
22 virtual uint32_t Time() const { return time_; } | 22 virtual int64_t Time() const { return time_; } |
23 void AdvanceTime(uint32_t delta) { time_ += delta; } | 23 void AdvanceTime(uint32_t delta) { time_ += delta; } |
24 | 24 |
25 private: | 25 private: |
26 uint32_t time_; | 26 uint32_t time_; |
27 }; | 27 }; |
28 | 28 |
29 TEST(RateTrackerTest, Test30FPS) { | 29 TEST(RateTrackerTest, Test30FPS) { |
30 RateTrackerForTest tracker; | 30 RateTrackerForTest tracker; |
31 | 31 |
32 for (int i = 0; i < 300; ++i) { | 32 for (int i = 0; i < 300; ++i) { |
33 tracker.AddSamples(1); | 33 tracker.AddSamples(1); |
34 tracker.AdvanceTime(33); | 34 tracker.AdvanceTime(33); |
35 if (i % 3 == 0) { | 35 if (i % 3 == 0) { |
36 tracker.AdvanceTime(1); | 36 tracker.AdvanceTime(1); |
37 } | 37 } |
38 } | 38 } |
39 EXPECT_DOUBLE_EQ(30.0, tracker.ComputeRateForInterval(50000u)); | 39 EXPECT_DOUBLE_EQ(30.0, tracker.ComputeRateForInterval(50000)); |
40 } | 40 } |
41 | 41 |
42 TEST(RateTrackerTest, Test60FPS) { | 42 TEST(RateTrackerTest, Test60FPS) { |
43 RateTrackerForTest tracker; | 43 RateTrackerForTest tracker; |
44 | 44 |
45 for (int i = 0; i < 300; ++i) { | 45 for (int i = 0; i < 300; ++i) { |
46 tracker.AddSamples(1); | 46 tracker.AddSamples(1); |
47 tracker.AdvanceTime(16); | 47 tracker.AdvanceTime(16); |
48 if (i % 3 != 0) { | 48 if (i % 3 != 0) { |
49 tracker.AdvanceTime(1); | 49 tracker.AdvanceTime(1); |
50 } | 50 } |
51 } | 51 } |
52 EXPECT_DOUBLE_EQ(60.0, tracker.ComputeRateForInterval(1000u)); | 52 EXPECT_DOUBLE_EQ(60.0, tracker.ComputeRateForInterval(1000)); |
53 } | 53 } |
54 | 54 |
55 TEST(RateTrackerTest, TestRateTrackerBasics) { | 55 TEST(RateTrackerTest, TestRateTrackerBasics) { |
56 RateTrackerForTest tracker; | 56 RateTrackerForTest tracker; |
57 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000u)); | 57 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000)); |
58 | 58 |
59 // Add a sample. | 59 // Add a sample. |
60 tracker.AddSamples(1234); | 60 tracker.AddSamples(1234); |
61 // Advance the clock by less than one bucket interval (no rate returned). | 61 // Advance the clock by less than one bucket interval (no rate returned). |
62 tracker.AdvanceTime(kBucketIntervalMs - 1); | 62 tracker.AdvanceTime(kBucketIntervalMs - 1); |
63 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); | 63 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); |
64 // Advance the clock by 100 ms (one bucket interval). | 64 // Advance the clock by 100 ms (one bucket interval). |
65 tracker.AdvanceTime(1); | 65 tracker.AdvanceTime(1); |
66 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000u)); | 66 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000)); |
67 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate()); | 67 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate()); |
68 EXPECT_EQ(1234U, tracker.TotalSampleCount()); | 68 EXPECT_EQ(1234U, tracker.TotalSampleCount()); |
69 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate()); | 69 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate()); |
70 | 70 |
71 // Repeat. | 71 // Repeat. |
72 tracker.AddSamples(1234); | 72 tracker.AddSamples(1234); |
73 tracker.AdvanceTime(100); | 73 tracker.AdvanceTime(100); |
74 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000u)); | 74 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000)); |
75 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate()); | 75 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate()); |
76 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); | 76 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); |
77 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate()); | 77 EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate()); |
78 | 78 |
79 // Advance the clock by 800 ms, so we've elapsed a full second. | 79 // Advance the clock by 800 ms, so we've elapsed a full second. |
80 // units_second should now be filled in properly. | 80 // units_second should now be filled in properly. |
81 tracker.AdvanceTime(800); | 81 tracker.AdvanceTime(800); |
82 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000u)); | 82 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000)); |
83 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate()); | 83 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate()); |
84 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); | 84 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); |
85 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate()); | 85 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate()); |
86 | 86 |
87 // Poll the tracker again immediately. The reported rate should stay the same. | 87 // Poll the tracker again immediately. The reported rate should stay the same. |
88 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000u)); | 88 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000)); |
89 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate()); | 89 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate()); |
90 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); | 90 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); |
91 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate()); | 91 EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate()); |
92 | 92 |
93 // Do nothing and advance by a second. We should drop down to zero. | 93 // Do nothing and advance by a second. We should drop down to zero. |
94 tracker.AdvanceTime(1000); | 94 tracker.AdvanceTime(1000); |
95 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000u)); | 95 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000)); |
96 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); | 96 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); |
97 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); | 97 EXPECT_EQ(1234U * 2, tracker.TotalSampleCount()); |
98 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeTotalRate()); | 98 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeTotalRate()); |
99 | 99 |
100 // Send a bunch of data at a constant rate for 5.5 "seconds". | 100 // Send a bunch of data at a constant rate for 5.5 "seconds". |
101 // We should report the rate properly. | 101 // We should report the rate properly. |
102 for (int i = 0; i < 5500; i += 100) { | 102 for (int i = 0; i < 5500; i += 100) { |
103 tracker.AddSamples(9876U); | 103 tracker.AddSamples(9876U); |
104 tracker.AdvanceTime(100); | 104 tracker.AdvanceTime(100); |
105 } | 105 } |
106 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRateForInterval(1000u)); | 106 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRateForInterval(1000)); |
107 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRate()); | 107 EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRate()); |
108 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount()); | 108 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount()); |
109 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 7.5, | 109 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 7.5, |
110 tracker.ComputeTotalRate()); | 110 tracker.ComputeTotalRate()); |
111 | 111 |
112 // Advance the clock by 500 ms. Since we sent nothing over this half-second, | 112 // Advance the clock by 500 ms. Since we sent nothing over this half-second, |
113 // the reported rate should be reduced by half. | 113 // the reported rate should be reduced by half. |
114 tracker.AdvanceTime(500); | 114 tracker.AdvanceTime(500); |
115 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRateForInterval(1000u)); | 115 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRateForInterval(1000)); |
116 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRate()); | 116 EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRate()); |
117 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount()); | 117 EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount()); |
118 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 8.0, | 118 EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 8.0, |
119 tracker.ComputeTotalRate()); | 119 tracker.ComputeTotalRate()); |
120 | 120 |
121 // Rate over the last half second should be zero. | 121 // Rate over the last half second should be zero. |
122 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(500u)); | 122 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(500)); |
123 } | 123 } |
124 | 124 |
125 TEST(RateTrackerTest, TestLongPeriodBetweenSamples) { | 125 TEST(RateTrackerTest, TestLongPeriodBetweenSamples) { |
126 RateTrackerForTest tracker; | 126 RateTrackerForTest tracker; |
127 tracker.AddSamples(1); | 127 tracker.AddSamples(1); |
128 tracker.AdvanceTime(1000); | 128 tracker.AdvanceTime(1000); |
129 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate()); | 129 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate()); |
130 | 130 |
131 tracker.AdvanceTime(2000); | 131 tracker.AdvanceTime(2000); |
132 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); | 132 EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate()); |
133 | 133 |
134 tracker.AdvanceTime(2000); | 134 tracker.AdvanceTime(2000); |
135 tracker.AddSamples(1); | 135 tracker.AddSamples(1); |
136 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate()); | 136 EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate()); |
137 } | 137 } |
138 | 138 |
139 TEST(RateTrackerTest, TestRolloff) { | 139 TEST(RateTrackerTest, TestRolloff) { |
140 RateTrackerForTest tracker; | 140 RateTrackerForTest tracker; |
141 for (int i = 0; i < 10; ++i) { | 141 for (int i = 0; i < 10; ++i) { |
142 tracker.AddSamples(1U); | 142 tracker.AddSamples(1U); |
143 tracker.AdvanceTime(100); | 143 tracker.AdvanceTime(100); |
144 } | 144 } |
145 EXPECT_DOUBLE_EQ(10.0, tracker.ComputeRate()); | 145 EXPECT_DOUBLE_EQ(10.0, tracker.ComputeRate()); |
146 | 146 |
147 for (int i = 0; i < 10; ++i) { | 147 for (int i = 0; i < 10; ++i) { |
148 tracker.AddSamples(1U); | 148 tracker.AddSamples(1U); |
149 tracker.AdvanceTime(50); | 149 tracker.AdvanceTime(50); |
150 } | 150 } |
151 EXPECT_DOUBLE_EQ(15.0, tracker.ComputeRate()); | 151 EXPECT_DOUBLE_EQ(15.0, tracker.ComputeRate()); |
152 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRateForInterval(500u)); | 152 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRateForInterval(500)); |
153 | 153 |
154 for (int i = 0; i < 10; ++i) { | 154 for (int i = 0; i < 10; ++i) { |
155 tracker.AddSamples(1U); | 155 tracker.AddSamples(1U); |
156 tracker.AdvanceTime(50); | 156 tracker.AdvanceTime(50); |
157 } | 157 } |
158 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRate()); | 158 EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRate()); |
159 } | 159 } |
160 | 160 |
161 TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) { | 161 TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) { |
162 RateTrackerForTest tracker; | 162 RateTrackerForTest tracker; |
163 tracker.AddSamples(1234); | 163 tracker.AddSamples(1234); |
164 tracker.AdvanceTime(1000); | 164 tracker.AdvanceTime(1000); |
165 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeRateForInterval(1000u)); | 165 EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeRateForInterval(1000)); |
166 } | 166 } |
167 | 167 |
168 } // namespace rtc | 168 } // namespace rtc |
OLD | NEW |