OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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/video/stats_counter.h" | 11 #include "webrtc/video/stats_counter.h" |
12 | 12 |
13 #include "webrtc/system_wrappers/include/clock.h" | 13 #include "webrtc/system_wrappers/include/clock.h" |
14 #include "webrtc/test/gtest.h" | 14 #include "webrtc/test/gtest.h" |
15 | 15 |
16 namespace webrtc { | 16 namespace webrtc { |
17 namespace { | 17 namespace { |
18 const int kProcessIntervalMs = 2000; | 18 const int kDefaultProcessIntervalMs = 2000; |
19 | 19 |
20 class StatsCounterObserverImpl : public StatsCounterObserver { | 20 class StatsCounterObserverImpl : public StatsCounterObserver { |
21 public: | 21 public: |
22 StatsCounterObserverImpl() : num_calls_(0), last_sample_(-1) {} | 22 StatsCounterObserverImpl() : num_calls_(0), last_sample_(-1) {} |
23 void OnMetricUpdated(int sample) override { | 23 void OnMetricUpdated(int sample) override { |
24 ++num_calls_; | 24 ++num_calls_; |
25 last_sample_ = sample; | 25 last_sample_ = sample; |
26 } | 26 } |
27 int num_calls_; | 27 int num_calls_; |
28 int last_sample_; | 28 int last_sample_; |
(...skipping 29 matching lines...) Expand all Loading... |
58 | 58 |
59 TEST_F(StatsCounterTest, NoSamples) { | 59 TEST_F(StatsCounterTest, NoSamples) { |
60 AvgCounter counter(&clock_, nullptr, false); | 60 AvgCounter counter(&clock_, nullptr, false); |
61 VerifyStatsIsNotSet(counter.GetStats()); | 61 VerifyStatsIsNotSet(counter.GetStats()); |
62 } | 62 } |
63 | 63 |
64 TEST_F(StatsCounterTest, TestRegisterObserver) { | 64 TEST_F(StatsCounterTest, TestRegisterObserver) { |
65 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 65 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
66 const int kSample = 22; | 66 const int kSample = 22; |
67 AvgCounter counter(&clock_, observer, false); | 67 AvgCounter counter(&clock_, observer, false); |
68 AddSampleAndAdvance(kSample, kProcessIntervalMs, &counter); | 68 AddSampleAndAdvance(kSample, kDefaultProcessIntervalMs, &counter); |
69 // Trigger process (sample included in next interval). | 69 // Trigger process (sample included in next interval). |
70 counter.Add(111); | 70 counter.Add(111); |
71 EXPECT_EQ(1, observer->num_calls_); | 71 EXPECT_EQ(1, observer->num_calls_); |
72 } | 72 } |
73 | 73 |
74 TEST_F(StatsCounterTest, HasSample) { | 74 TEST_F(StatsCounterTest, HasSample) { |
75 AvgCounter counter(&clock_, nullptr, false); | 75 AvgCounter counter(&clock_, nullptr, false); |
76 EXPECT_FALSE(counter.HasSample()); | 76 EXPECT_FALSE(counter.HasSample()); |
77 counter.Add(1); | 77 counter.Add(1); |
78 EXPECT_TRUE(counter.HasSample()); | 78 EXPECT_TRUE(counter.HasSample()); |
79 } | 79 } |
80 | 80 |
81 TEST_F(StatsCounterTest, VerifyProcessInterval) { | 81 TEST_F(StatsCounterTest, VerifyProcessInterval) { |
82 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 82 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
83 AvgCounter counter(&clock_, observer, false); | 83 AvgCounter counter(&clock_, observer, false); |
84 counter.Add(4); | 84 counter.Add(4); |
85 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1); | 85 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs - 1); |
86 // Try trigger process (interval has not passed). | 86 // Try trigger process (interval has not passed). |
87 counter.Add(8); | 87 counter.Add(8); |
88 EXPECT_EQ(0, observer->num_calls_); | 88 EXPECT_EQ(0, observer->num_calls_); |
89 VerifyStatsIsNotSet(counter.GetStats()); | 89 VerifyStatsIsNotSet(counter.GetStats()); |
90 // Make process interval pass. | 90 // Make process interval pass. |
91 clock_.AdvanceTimeMilliseconds(1); | 91 clock_.AdvanceTimeMilliseconds(1); |
92 // Trigger process (sample included in next interval). | 92 // Trigger process (sample included in next interval). |
93 counter.Add(111); | 93 counter.Add(111); |
94 EXPECT_EQ(1, observer->num_calls_); | 94 EXPECT_EQ(1, observer->num_calls_); |
95 EXPECT_EQ(6, observer->last_sample_); | 95 EXPECT_EQ(6, observer->last_sample_); |
96 // Aggregated stats. | 96 // Aggregated stats. |
97 AggregatedStats stats = counter.GetStats(); | 97 AggregatedStats stats = counter.GetStats(); |
98 EXPECT_EQ(1, stats.num_samples); | 98 EXPECT_EQ(1, stats.num_samples); |
99 } | 99 } |
100 | 100 |
101 TEST_F(StatsCounterTest, TestMetric_AvgCounter) { | 101 TEST_F(StatsCounterTest, TestMetric_AvgCounter) { |
102 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 102 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
103 AvgCounter counter(&clock_, observer, false); | 103 AvgCounter counter(&clock_, observer, false); |
104 counter.Add(4); | 104 counter.Add(4); |
105 counter.Add(8); | 105 counter.Add(8); |
106 counter.Add(9); | 106 counter.Add(9); |
107 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 107 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs); |
108 // Trigger process (sample included in next interval). | 108 // Trigger process (sample included in next interval). |
109 counter.Add(111); | 109 counter.Add(111); |
110 // Average per interval. | 110 // Average per interval. |
111 EXPECT_EQ(1, observer->num_calls_); | 111 EXPECT_EQ(1, observer->num_calls_); |
112 EXPECT_EQ(7, observer->last_sample_); | 112 EXPECT_EQ(7, observer->last_sample_); |
113 // Aggregated stats. | 113 // Aggregated stats. |
114 AggregatedStats stats = counter.GetStats(); | 114 AggregatedStats stats = counter.GetStats(); |
115 EXPECT_EQ(1, stats.num_samples); | 115 EXPECT_EQ(1, stats.num_samples); |
116 EXPECT_EQ(7, stats.min); | 116 EXPECT_EQ(7, stats.min); |
117 EXPECT_EQ(7, stats.max); | 117 EXPECT_EQ(7, stats.max); |
118 EXPECT_EQ(7, stats.average); | 118 EXPECT_EQ(7, stats.average); |
119 } | 119 } |
120 | 120 |
121 TEST_F(StatsCounterTest, TestMetric_MaxCounter) { | 121 TEST_F(StatsCounterTest, TestMetric_MaxCounter) { |
| 122 const int64_t kProcessIntervalMs = 1000; |
122 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 123 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
123 MaxCounter counter(&clock_, observer); | 124 MaxCounter counter(&clock_, observer, kProcessIntervalMs); |
124 counter.Add(4); | 125 counter.Add(4); |
125 counter.Add(9); | 126 counter.Add(9); |
126 counter.Add(8); | 127 counter.Add(8); |
127 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 128 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); |
128 // Trigger process (sample included in next interval). | 129 // Trigger process (sample included in next interval). |
129 counter.Add(111); | 130 counter.Add(111); |
130 // Average per interval. | 131 // Average per interval. |
131 EXPECT_EQ(1, observer->num_calls_); | 132 EXPECT_EQ(1, observer->num_calls_); |
132 EXPECT_EQ(9, observer->last_sample_); | 133 EXPECT_EQ(9, observer->last_sample_); |
133 // Aggregated stats. | 134 // Aggregated stats. |
134 AggregatedStats stats = counter.GetStats(); | 135 AggregatedStats stats = counter.GetStats(); |
135 EXPECT_EQ(1, stats.num_samples); | 136 EXPECT_EQ(1, stats.num_samples); |
136 EXPECT_EQ(9, stats.min); | 137 EXPECT_EQ(9, stats.min); |
137 EXPECT_EQ(9, stats.max); | 138 EXPECT_EQ(9, stats.max); |
138 EXPECT_EQ(9, stats.average); | 139 EXPECT_EQ(9, stats.average); |
139 } | 140 } |
140 | 141 |
141 TEST_F(StatsCounterTest, TestMetric_PercentCounter) { | 142 TEST_F(StatsCounterTest, TestMetric_PercentCounter) { |
142 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 143 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
143 PercentCounter counter(&clock_, observer); | 144 PercentCounter counter(&clock_, observer); |
144 counter.Add(true); | 145 counter.Add(true); |
145 counter.Add(false); | 146 counter.Add(false); |
146 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 147 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs); |
147 // Trigger process (sample included in next interval). | 148 // Trigger process (sample included in next interval). |
148 counter.Add(false); | 149 counter.Add(false); |
149 // Percentage per interval. | 150 // Percentage per interval. |
150 EXPECT_EQ(1, observer->num_calls_); | 151 EXPECT_EQ(1, observer->num_calls_); |
151 EXPECT_EQ(50, observer->last_sample_); | 152 EXPECT_EQ(50, observer->last_sample_); |
152 // Aggregated stats. | 153 // Aggregated stats. |
153 AggregatedStats stats = counter.GetStats(); | 154 AggregatedStats stats = counter.GetStats(); |
154 EXPECT_EQ(1, stats.num_samples); | 155 EXPECT_EQ(1, stats.num_samples); |
155 EXPECT_EQ(50, stats.min); | 156 EXPECT_EQ(50, stats.min); |
156 EXPECT_EQ(50, stats.max); | 157 EXPECT_EQ(50, stats.max); |
157 } | 158 } |
158 | 159 |
159 TEST_F(StatsCounterTest, TestMetric_PermilleCounter) { | 160 TEST_F(StatsCounterTest, TestMetric_PermilleCounter) { |
160 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 161 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
161 PermilleCounter counter(&clock_, observer); | 162 PermilleCounter counter(&clock_, observer); |
162 counter.Add(true); | 163 counter.Add(true); |
163 counter.Add(false); | 164 counter.Add(false); |
164 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 165 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs); |
165 // Trigger process (sample included in next interval). | 166 // Trigger process (sample included in next interval). |
166 counter.Add(false); | 167 counter.Add(false); |
167 // Permille per interval. | 168 // Permille per interval. |
168 EXPECT_EQ(1, observer->num_calls_); | 169 EXPECT_EQ(1, observer->num_calls_); |
169 EXPECT_EQ(500, observer->last_sample_); | 170 EXPECT_EQ(500, observer->last_sample_); |
170 // Aggregated stats. | 171 // Aggregated stats. |
171 AggregatedStats stats = counter.GetStats(); | 172 AggregatedStats stats = counter.GetStats(); |
172 EXPECT_EQ(1, stats.num_samples); | 173 EXPECT_EQ(1, stats.num_samples); |
173 EXPECT_EQ(500, stats.min); | 174 EXPECT_EQ(500, stats.min); |
174 EXPECT_EQ(500, stats.max); | 175 EXPECT_EQ(500, stats.max); |
175 } | 176 } |
176 | 177 |
177 TEST_F(StatsCounterTest, TestMetric_RateCounter) { | 178 TEST_F(StatsCounterTest, TestMetric_RateCounter) { |
178 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 179 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
179 RateCounter counter(&clock_, observer, true); | 180 RateCounter counter(&clock_, observer, true); |
180 counter.Add(186); | 181 counter.Add(186); |
181 counter.Add(350); | 182 counter.Add(350); |
182 counter.Add(22); | 183 counter.Add(22); |
183 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 184 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs); |
184 // Trigger process (sample included in next interval). | 185 // Trigger process (sample included in next interval). |
185 counter.Add(111); | 186 counter.Add(111); |
186 // Rate per interval, (186 + 350 + 22) / 2 sec = 279 samples/sec | 187 // Rate per interval, (186 + 350 + 22) / 2 sec = 279 samples/sec |
187 EXPECT_EQ(1, observer->num_calls_); | 188 EXPECT_EQ(1, observer->num_calls_); |
188 EXPECT_EQ(279, observer->last_sample_); | 189 EXPECT_EQ(279, observer->last_sample_); |
189 // Aggregated stats. | 190 // Aggregated stats. |
190 AggregatedStats stats = counter.GetStats(); | 191 AggregatedStats stats = counter.GetStats(); |
191 EXPECT_EQ(1, stats.num_samples); | 192 EXPECT_EQ(1, stats.num_samples); |
192 EXPECT_EQ(279, stats.min); | 193 EXPECT_EQ(279, stats.min); |
193 EXPECT_EQ(279, stats.max); | 194 EXPECT_EQ(279, stats.max); |
194 } | 195 } |
195 | 196 |
196 TEST_F(StatsCounterTest, TestMetric_RateAccCounter) { | 197 TEST_F(StatsCounterTest, TestMetric_RateAccCounter) { |
197 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 198 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
198 RateAccCounter counter(&clock_, observer, true); | 199 RateAccCounter counter(&clock_, observer, true); |
199 counter.Set(175); | 200 counter.Set(175); |
200 counter.Set(188); | 201 counter.Set(188); |
201 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 202 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs); |
202 // Trigger process (sample included in next interval). | 203 // Trigger process (sample included in next interval). |
203 counter.Set(192); | 204 counter.Set(192); |
204 // Rate per interval: (188 - 0) / 2 sec = 94 samples/sec | 205 // Rate per interval: (188 - 0) / 2 sec = 94 samples/sec |
205 EXPECT_EQ(1, observer->num_calls_); | 206 EXPECT_EQ(1, observer->num_calls_); |
206 EXPECT_EQ(94, observer->last_sample_); | 207 EXPECT_EQ(94, observer->last_sample_); |
207 // Aggregated stats. | 208 // Aggregated stats. |
208 AggregatedStats stats = counter.GetStats(); | 209 AggregatedStats stats = counter.GetStats(); |
209 EXPECT_EQ(1, stats.num_samples); | 210 EXPECT_EQ(1, stats.num_samples); |
210 EXPECT_EQ(94, stats.min); | 211 EXPECT_EQ(94, stats.min); |
211 EXPECT_EQ(94, stats.max); | 212 EXPECT_EQ(94, stats.max); |
212 } | 213 } |
213 | 214 |
214 TEST_F(StatsCounterTest, TestGetStats_MultipleIntervals) { | 215 TEST_F(StatsCounterTest, TestGetStats_MultipleIntervals) { |
215 AvgCounter counter(&clock_, nullptr, false); | 216 AvgCounter counter(&clock_, nullptr, false); |
216 const int kSample1 = 1; | 217 const int kSample1 = 1; |
217 const int kSample2 = 5; | 218 const int kSample2 = 5; |
218 const int kSample3 = 8; | 219 const int kSample3 = 8; |
219 const int kSample4 = 11; | 220 const int kSample4 = 11; |
220 const int kSample5 = 50; | 221 const int kSample5 = 50; |
221 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); | 222 AddSampleAndAdvance(kSample1, kDefaultProcessIntervalMs, &counter); |
222 AddSampleAndAdvance(kSample2, kProcessIntervalMs, &counter); | 223 AddSampleAndAdvance(kSample2, kDefaultProcessIntervalMs, &counter); |
223 AddSampleAndAdvance(kSample3, kProcessIntervalMs, &counter); | 224 AddSampleAndAdvance(kSample3, kDefaultProcessIntervalMs, &counter); |
224 AddSampleAndAdvance(kSample4, kProcessIntervalMs, &counter); | 225 AddSampleAndAdvance(kSample4, kDefaultProcessIntervalMs, &counter); |
225 AddSampleAndAdvance(kSample5, kProcessIntervalMs, &counter); | 226 AddSampleAndAdvance(kSample5, kDefaultProcessIntervalMs, &counter); |
226 // Trigger process (sample included in next interval). | 227 // Trigger process (sample included in next interval). |
227 counter.Add(111); | 228 counter.Add(111); |
228 AggregatedStats stats = counter.GetStats(); | 229 AggregatedStats stats = counter.GetStats(); |
229 EXPECT_EQ(5, stats.num_samples); | 230 EXPECT_EQ(5, stats.num_samples); |
230 EXPECT_EQ(kSample1, stats.min); | 231 EXPECT_EQ(kSample1, stats.min); |
231 EXPECT_EQ(kSample5, stats.max); | 232 EXPECT_EQ(kSample5, stats.max); |
232 EXPECT_EQ(15, stats.average); | 233 EXPECT_EQ(15, stats.average); |
233 } | 234 } |
234 | 235 |
235 TEST_F(StatsCounterTest, TestGetStatsTwice) { | 236 TEST_F(StatsCounterTest, TestGetStatsTwice) { |
236 const int kSample1 = 4; | 237 const int kSample1 = 4; |
237 const int kSample2 = 7; | 238 const int kSample2 = 7; |
238 AvgCounter counter(&clock_, nullptr, false); | 239 AvgCounter counter(&clock_, nullptr, false); |
239 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); | 240 AddSampleAndAdvance(kSample1, kDefaultProcessIntervalMs, &counter); |
240 // Trigger process (sample included in next interval). | 241 // Trigger process (sample included in next interval). |
241 counter.Add(kSample2); | 242 counter.Add(kSample2); |
242 AggregatedStats stats = counter.GetStats(); | 243 AggregatedStats stats = counter.GetStats(); |
243 EXPECT_EQ(1, stats.num_samples); | 244 EXPECT_EQ(1, stats.num_samples); |
244 EXPECT_EQ(kSample1, stats.min); | 245 EXPECT_EQ(kSample1, stats.min); |
245 EXPECT_EQ(kSample1, stats.max); | 246 EXPECT_EQ(kSample1, stats.max); |
246 // Trigger process (sample included in next interval). | 247 // Trigger process (sample included in next interval). |
247 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 248 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs); |
248 counter.Add(111); | 249 counter.Add(111); |
249 stats = counter.GetStats(); | 250 stats = counter.GetStats(); |
250 EXPECT_EQ(2, stats.num_samples); | 251 EXPECT_EQ(2, stats.num_samples); |
251 EXPECT_EQ(kSample1, stats.min); | 252 EXPECT_EQ(kSample1, stats.min); |
252 EXPECT_EQ(kSample2, stats.max); | 253 EXPECT_EQ(kSample2, stats.max); |
253 EXPECT_EQ(6, stats.average); | 254 EXPECT_EQ(6, stats.average); |
254 } | 255 } |
255 | 256 |
256 TEST_F(StatsCounterTest, TestRateAccCounter_NegativeRateIgnored) { | 257 TEST_F(StatsCounterTest, TestRateAccCounter_NegativeRateIgnored) { |
257 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 258 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
258 const int kSample1 = 200; // 200 / 2 sec | 259 const int kSample1 = 200; // 200 / 2 sec |
259 const int kSample2 = 100; // -100 / 2 sec - negative ignored | 260 const int kSample2 = 100; // -100 / 2 sec - negative ignored |
260 const int kSample3 = 700; // 600 / 2 sec | 261 const int kSample3 = 700; // 600 / 2 sec |
261 RateAccCounter counter(&clock_, observer, true); | 262 RateAccCounter counter(&clock_, observer, true); |
262 SetSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); | 263 SetSampleAndAdvance(kSample1, kDefaultProcessIntervalMs, &counter); |
263 SetSampleAndAdvance(kSample2, kProcessIntervalMs, &counter); | 264 SetSampleAndAdvance(kSample2, kDefaultProcessIntervalMs, &counter); |
264 SetSampleAndAdvance(kSample3, kProcessIntervalMs, &counter); | 265 SetSampleAndAdvance(kSample3, kDefaultProcessIntervalMs, &counter); |
265 EXPECT_EQ(1, observer->num_calls_); | 266 EXPECT_EQ(1, observer->num_calls_); |
266 EXPECT_EQ(100, observer->last_sample_); | 267 EXPECT_EQ(100, observer->last_sample_); |
267 // Trigger process (sample included in next interval). | 268 // Trigger process (sample included in next interval). |
268 counter.Set(2000); | 269 counter.Set(2000); |
269 EXPECT_EQ(2, observer->num_calls_); | 270 EXPECT_EQ(2, observer->num_calls_); |
270 EXPECT_EQ(300, observer->last_sample_); | 271 EXPECT_EQ(300, observer->last_sample_); |
271 // Aggregated stats. | 272 // Aggregated stats. |
272 AggregatedStats stats = counter.GetStats(); | 273 AggregatedStats stats = counter.GetStats(); |
273 EXPECT_EQ(2, stats.num_samples); | 274 EXPECT_EQ(2, stats.num_samples); |
274 EXPECT_EQ(100, stats.min); | 275 EXPECT_EQ(100, stats.min); |
275 EXPECT_EQ(300, stats.max); | 276 EXPECT_EQ(300, stats.max); |
276 EXPECT_EQ(200, stats.average); | 277 EXPECT_EQ(200, stats.average); |
277 } | 278 } |
278 | 279 |
279 TEST_F(StatsCounterTest, TestAvgCounter_IntervalsWithoutSamplesIncluded) { | 280 TEST_F(StatsCounterTest, TestAvgCounter_IntervalsWithoutSamplesIncluded) { |
280 // Samples: | 6 | x | x | 8 | // x: empty interval | 281 // Samples: | 6 | x | x | 8 | // x: empty interval |
281 // Stats: | 6 | 6 | 6 | 8 | // x -> last value reported | 282 // Stats: | 6 | 6 | 6 | 8 | // x -> last value reported |
282 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 283 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
283 AvgCounter counter(&clock_, observer, true); | 284 AvgCounter counter(&clock_, observer, true); |
284 AddSampleAndAdvance(6, kProcessIntervalMs * 4 - 1, &counter); | 285 AddSampleAndAdvance(6, kDefaultProcessIntervalMs * 4 - 1, &counter); |
285 // Trigger process (sample included in next interval). | 286 // Trigger process (sample included in next interval). |
286 counter.Add(8); | 287 counter.Add(8); |
287 // [6:3], 3 intervals passed (2 without samples -> last value reported). | 288 // [6:3], 3 intervals passed (2 without samples -> last value reported). |
288 AggregatedStats stats = counter.ProcessAndGetStats(); | 289 AggregatedStats stats = counter.ProcessAndGetStats(); |
289 EXPECT_EQ(3, stats.num_samples); | 290 EXPECT_EQ(3, stats.num_samples); |
290 EXPECT_EQ(6, stats.min); | 291 EXPECT_EQ(6, stats.min); |
291 EXPECT_EQ(6, stats.max); | 292 EXPECT_EQ(6, stats.max); |
292 // Make next interval pass and verify stats: [6:3],[8:1] | 293 // Make next interval pass and verify stats: [6:3],[8:1] |
293 clock_.AdvanceTimeMilliseconds(1); | 294 clock_.AdvanceTimeMilliseconds(1); |
294 counter.ProcessAndGetStats(); | 295 counter.ProcessAndGetStats(); |
295 EXPECT_EQ(4, observer->num_calls_); | 296 EXPECT_EQ(4, observer->num_calls_); |
296 EXPECT_EQ(8, observer->last_sample_); | 297 EXPECT_EQ(8, observer->last_sample_); |
297 } | 298 } |
298 | 299 |
299 TEST_F(StatsCounterTest, TestAvgCounter_WithPause) { | 300 TEST_F(StatsCounterTest, TestAvgCounter_WithPause) { |
300 // Samples: | 6 | x | x | x | - | 22 | x | // x: empty interval, -: paused | 301 // Samples: | 6 | x | x | x | - | 22 | x | // x: empty interval, -: paused |
301 // Stats: | 6 | 6 | 6 | 6 | - | 22 | 22 | // x -> last value reported | 302 // Stats: | 6 | 6 | 6 | 6 | - | 22 | 22 | // x -> last value reported |
302 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 303 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
303 AvgCounter counter(&clock_, observer, true); | 304 AvgCounter counter(&clock_, observer, true); |
304 // Add sample and advance 3 intervals (2 w/o samples -> last value reported). | 305 // Add sample and advance 3 intervals (2 w/o samples -> last value reported). |
305 AddSampleAndAdvance(6, kProcessIntervalMs * 4 - 1, &counter); | 306 AddSampleAndAdvance(6, kDefaultProcessIntervalMs * 4 - 1, &counter); |
306 // Trigger process and verify stats: [6:3] | 307 // Trigger process and verify stats: [6:3] |
307 counter.ProcessAndGetStats(); | 308 counter.ProcessAndGetStats(); |
308 EXPECT_EQ(3, observer->num_calls_); | 309 EXPECT_EQ(3, observer->num_calls_); |
309 EXPECT_EQ(6, observer->last_sample_); | 310 EXPECT_EQ(6, observer->last_sample_); |
310 // Make next interval pass (1 without samples). | 311 // Make next interval pass (1 without samples). |
311 // Process and pause. Verify stats: [6:4]. | 312 // Process and pause. Verify stats: [6:4]. |
312 clock_.AdvanceTimeMilliseconds(1); | 313 clock_.AdvanceTimeMilliseconds(1); |
313 counter.ProcessAndPause(); | 314 counter.ProcessAndPause(); |
314 EXPECT_EQ(4, observer->num_calls_); // Last value reported. | 315 EXPECT_EQ(4, observer->num_calls_); // Last value reported. |
315 EXPECT_EQ(6, observer->last_sample_); | 316 EXPECT_EQ(6, observer->last_sample_); |
316 // Make next interval pass (1 without samples -> ignored while paused). | 317 // Make next interval pass (1 without samples -> ignored while paused). |
317 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 2 - 1); | 318 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 2 - 1); |
318 counter.Add(22); // Stops pause. | 319 counter.Add(22); // Stops pause. |
319 EXPECT_EQ(4, observer->num_calls_); | 320 EXPECT_EQ(4, observer->num_calls_); |
320 EXPECT_EQ(6, observer->last_sample_); | 321 EXPECT_EQ(6, observer->last_sample_); |
321 // Make next interval pass, [6:4][22:1] | 322 // Make next interval pass, [6:4][22:1] |
322 clock_.AdvanceTimeMilliseconds(1); | 323 clock_.AdvanceTimeMilliseconds(1); |
323 counter.ProcessAndGetStats(); | 324 counter.ProcessAndGetStats(); |
324 EXPECT_EQ(5, observer->num_calls_); | 325 EXPECT_EQ(5, observer->num_calls_); |
325 EXPECT_EQ(22, observer->last_sample_); | 326 EXPECT_EQ(22, observer->last_sample_); |
326 // Make 1 interval pass (1 w/o samples -> pause stopped, last value reported). | 327 // Make 1 interval pass (1 w/o samples -> pause stopped, last value reported). |
327 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 328 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs); |
328 counter.ProcessAndGetStats(); | 329 counter.ProcessAndGetStats(); |
329 EXPECT_EQ(6, observer->num_calls_); | 330 EXPECT_EQ(6, observer->num_calls_); |
330 EXPECT_EQ(22, observer->last_sample_); | 331 EXPECT_EQ(22, observer->last_sample_); |
331 } | 332 } |
332 | 333 |
333 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIgnored) { | 334 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIgnored) { |
334 // Samples: | 50 | x | 20 | // x: empty interval | 335 // Samples: | 50 | x | 20 | // x: empty interval |
335 // Stats: | 25 | x | 10 | // x -> ignored | 336 // Stats: | 25 | x | 10 | // x -> ignored |
336 const bool kIncludeEmptyIntervals = false; | 337 const bool kIncludeEmptyIntervals = false; |
337 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 338 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
338 const int kSample1 = 50; // 50 / 2 sec | 339 const int kSample1 = 50; // 50 / 2 sec |
339 const int kSample2 = 20; // 20 / 2 sec | 340 const int kSample2 = 20; // 20 / 2 sec |
340 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); | 341 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); |
341 counter.Add(kSample1); | 342 counter.Add(kSample1); |
342 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1); | 343 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 3 - 1); |
343 // Trigger process (sample included in next interval). | 344 // Trigger process (sample included in next interval). |
344 counter.Add(kSample2); | 345 counter.Add(kSample2); |
345 // [25:1], 2 intervals passed (1 without samples -> ignored). | 346 // [25:1], 2 intervals passed (1 without samples -> ignored). |
346 EXPECT_EQ(1, observer->num_calls_); | 347 EXPECT_EQ(1, observer->num_calls_); |
347 EXPECT_EQ(25, observer->last_sample_); | 348 EXPECT_EQ(25, observer->last_sample_); |
348 // Make next interval pass and verify stats: [10:1],[25:1] | 349 // Make next interval pass and verify stats: [10:1],[25:1] |
349 clock_.AdvanceTimeMilliseconds(1); | 350 clock_.AdvanceTimeMilliseconds(1); |
350 counter.ProcessAndGetStats(); | 351 counter.ProcessAndGetStats(); |
351 EXPECT_EQ(2, observer->num_calls_); | 352 EXPECT_EQ(2, observer->num_calls_); |
352 EXPECT_EQ(10, observer->last_sample_); | 353 EXPECT_EQ(10, observer->last_sample_); |
353 } | 354 } |
354 | 355 |
355 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIncluded) { | 356 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIncluded) { |
356 // Samples: | 50 | x | 20 | // x: empty interval | 357 // Samples: | 50 | x | 20 | // x: empty interval |
357 // Stats: | 25 | 0 | 10 | // x -> zero reported | 358 // Stats: | 25 | 0 | 10 | // x -> zero reported |
358 const bool kIncludeEmptyIntervals = true; | 359 const bool kIncludeEmptyIntervals = true; |
359 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 360 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
360 const int kSample1 = 50; // 50 / 2 sec | 361 const int kSample1 = 50; // 50 / 2 sec |
361 const int kSample2 = 20; // 20 / 2 sec | 362 const int kSample2 = 20; // 20 / 2 sec |
362 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); | 363 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); |
363 counter.Add(kSample1); | 364 counter.Add(kSample1); |
364 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1); | 365 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 3 - 1); |
365 // Trigger process (sample included in next interval). | 366 // Trigger process (sample included in next interval). |
366 counter.Add(kSample2); | 367 counter.Add(kSample2); |
367 // [0:1],[25:1], 2 intervals passed (1 without samples -> zero reported). | 368 // [0:1],[25:1], 2 intervals passed (1 without samples -> zero reported). |
368 EXPECT_EQ(2, observer->num_calls_); | 369 EXPECT_EQ(2, observer->num_calls_); |
369 EXPECT_EQ(0, observer->last_sample_); | 370 EXPECT_EQ(0, observer->last_sample_); |
370 // Make last interval pass and verify stats: [0:1],[10:1],[25:1] | 371 // Make last interval pass and verify stats: [0:1],[10:1],[25:1] |
371 clock_.AdvanceTimeMilliseconds(1); | 372 clock_.AdvanceTimeMilliseconds(1); |
372 AggregatedStats stats = counter.ProcessAndGetStats(); | 373 AggregatedStats stats = counter.ProcessAndGetStats(); |
373 EXPECT_EQ(25, stats.max); | 374 EXPECT_EQ(25, stats.max); |
374 EXPECT_EQ(3, observer->num_calls_); | 375 EXPECT_EQ(3, observer->num_calls_); |
375 EXPECT_EQ(10, observer->last_sample_); | 376 EXPECT_EQ(10, observer->last_sample_); |
376 } | 377 } |
377 | 378 |
378 TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIncluded) { | 379 TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIncluded) { |
379 // Samples: | 12 | x | x | x | 60 | // x: empty interval | 380 // Samples: | 12 | x | x | x | 60 | // x: empty interval |
380 // Stats: | 6 | 0 | 0 | 0 | 24 | // x -> zero reported | 381 // Stats: | 6 | 0 | 0 | 0 | 24 | // x -> zero reported |
381 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 382 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
382 RateAccCounter counter(&clock_, observer, true); | 383 RateAccCounter counter(&clock_, observer, true); |
383 VerifyStatsIsNotSet(counter.ProcessAndGetStats()); | 384 VerifyStatsIsNotSet(counter.ProcessAndGetStats()); |
384 // Advance one interval and verify stats. | 385 // Advance one interval and verify stats. |
385 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 386 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs); |
386 VerifyStatsIsNotSet(counter.ProcessAndGetStats()); | 387 VerifyStatsIsNotSet(counter.ProcessAndGetStats()); |
387 // Add sample and advance 3 intervals (2 w/o samples -> zero reported). | 388 // Add sample and advance 3 intervals (2 w/o samples -> zero reported). |
388 counter.Set(12); | 389 counter.Set(12); |
389 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 4 - 1); | 390 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 4 - 1); |
390 // Trigger process and verify stats: [0:2][6:1] | 391 // Trigger process and verify stats: [0:2][6:1] |
391 counter.ProcessAndGetStats(); | 392 counter.ProcessAndGetStats(); |
392 EXPECT_EQ(3, observer->num_calls_); | 393 EXPECT_EQ(3, observer->num_calls_); |
393 EXPECT_EQ(0, observer->last_sample_); | 394 EXPECT_EQ(0, observer->last_sample_); |
394 // Make next interval pass (1 w/o samples -> zero reported), [0:3][6:1] | 395 // Make next interval pass (1 w/o samples -> zero reported), [0:3][6:1] |
395 clock_.AdvanceTimeMilliseconds(1); | 396 clock_.AdvanceTimeMilliseconds(1); |
396 counter.ProcessAndGetStats(); | 397 counter.ProcessAndGetStats(); |
397 EXPECT_EQ(4, observer->num_calls_); | 398 EXPECT_EQ(4, observer->num_calls_); |
398 EXPECT_EQ(0, observer->last_sample_); | 399 EXPECT_EQ(0, observer->last_sample_); |
399 // Insert sample and advance non-complete interval, no change, [0:3][6:1] | 400 // Insert sample and advance non-complete interval, no change, [0:3][6:1] |
400 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1); | 401 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs - 1); |
401 counter.Set(60); | 402 counter.Set(60); |
402 EXPECT_EQ(4, observer->num_calls_); | 403 EXPECT_EQ(4, observer->num_calls_); |
403 // Make next interval pass, [0:3][6:1][24:1] | 404 // Make next interval pass, [0:3][6:1][24:1] |
404 clock_.AdvanceTimeMilliseconds(1); | 405 clock_.AdvanceTimeMilliseconds(1); |
405 AggregatedStats stats = counter.ProcessAndGetStats(); | 406 AggregatedStats stats = counter.ProcessAndGetStats(); |
406 EXPECT_EQ(5, observer->num_calls_); | 407 EXPECT_EQ(5, observer->num_calls_); |
407 EXPECT_EQ(24, observer->last_sample_); | 408 EXPECT_EQ(24, observer->last_sample_); |
408 EXPECT_EQ(6, stats.average); | 409 EXPECT_EQ(6, stats.average); |
409 } | 410 } |
410 | 411 |
411 TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIgnored) { | 412 TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIgnored) { |
412 // Samples: | 12 | x | x | x | 60 | // x: empty interval | 413 // Samples: | 12 | x | x | x | 60 | // x: empty interval |
413 // Stats: | 6 | x | x | x | 24 | // x -> ignored | 414 // Stats: | 6 | x | x | x | 24 | // x -> ignored |
414 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 415 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
415 RateAccCounter counter(&clock_, observer, false); | 416 RateAccCounter counter(&clock_, observer, false); |
416 // Add sample and advance 3 intervals (2 w/o samples -> ignored). | 417 // Add sample and advance 3 intervals (2 w/o samples -> ignored). |
417 counter.Set(12); | 418 counter.Set(12); |
418 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 4 - 1); | 419 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 4 - 1); |
419 // Trigger process and verify stats: [6:1] | 420 // Trigger process and verify stats: [6:1] |
420 counter.ProcessAndGetStats(); | 421 counter.ProcessAndGetStats(); |
421 EXPECT_EQ(1, observer->num_calls_); | 422 EXPECT_EQ(1, observer->num_calls_); |
422 EXPECT_EQ(6, observer->last_sample_); | 423 EXPECT_EQ(6, observer->last_sample_); |
423 // Make next interval pass (1 w/o samples -> ignored), [6:1] | 424 // Make next interval pass (1 w/o samples -> ignored), [6:1] |
424 clock_.AdvanceTimeMilliseconds(1); | 425 clock_.AdvanceTimeMilliseconds(1); |
425 counter.ProcessAndGetStats(); | 426 counter.ProcessAndGetStats(); |
426 EXPECT_EQ(1, observer->num_calls_); | 427 EXPECT_EQ(1, observer->num_calls_); |
427 // Insert sample and advance non-complete interval, no change, [6:1] | 428 // Insert sample and advance non-complete interval, no change, [6:1] |
428 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1); | 429 clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs - 1); |
429 counter.Set(60); | 430 counter.Set(60); |
430 counter.ProcessAndGetStats(); | 431 counter.ProcessAndGetStats(); |
431 EXPECT_EQ(1, observer->num_calls_); | 432 EXPECT_EQ(1, observer->num_calls_); |
432 // Make next interval pass, [6:1][24:1] | 433 // Make next interval pass, [6:1][24:1] |
433 clock_.AdvanceTimeMilliseconds(1); | 434 clock_.AdvanceTimeMilliseconds(1); |
434 counter.ProcessAndGetStats(); | 435 counter.ProcessAndGetStats(); |
435 EXPECT_EQ(2, observer->num_calls_); | 436 EXPECT_EQ(2, observer->num_calls_); |
436 EXPECT_EQ(24, observer->last_sample_); | 437 EXPECT_EQ(24, observer->last_sample_); |
437 } | 438 } |
438 | 439 |
439 } // namespace webrtc | 440 } // namespace webrtc |
OLD | NEW |