Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(448)

Side by Side Diff: webrtc/video/stats_counter_unittest.cc

Issue 2307913002: Update AvgCounter to have the ability to include last period metric for subsequent intervals withou… (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« webrtc/video/stats_counter.cc ('K') | « webrtc/video/stats_counter.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 EXPECT_EQ(0, stats.num_samples); 51 EXPECT_EQ(0, stats.num_samples);
52 EXPECT_EQ(-1, stats.min); 52 EXPECT_EQ(-1, stats.min);
53 EXPECT_EQ(-1, stats.max); 53 EXPECT_EQ(-1, stats.max);
54 EXPECT_EQ(-1, stats.average); 54 EXPECT_EQ(-1, stats.average);
55 } 55 }
56 56
57 SimulatedClock clock_; 57 SimulatedClock clock_;
58 }; 58 };
59 59
60 TEST_F(StatsCounterTest, NoSamples) { 60 TEST_F(StatsCounterTest, NoSamples) {
61 AvgCounter counter(&clock_, nullptr); 61 AvgCounter counter(&clock_, nullptr, false);
62 VerifyStatsIsNotSet(counter.GetStats()); 62 VerifyStatsIsNotSet(counter.GetStats());
63 } 63 }
64 64
65 TEST_F(StatsCounterTest, TestRegisterObserver) { 65 TEST_F(StatsCounterTest, TestRegisterObserver) {
66 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); 66 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
67 const int kSample = 22; 67 const int kSample = 22;
68 AvgCounter counter(&clock_, observer); 68 AvgCounter counter(&clock_, observer, false);
69 AddSampleAndAdvance(kSample, kProcessIntervalMs, &counter); 69 AddSampleAndAdvance(kSample, kProcessIntervalMs, &counter);
70 // Trigger process (sample included in next interval). 70 // Trigger process (sample included in next interval).
71 counter.Add(111); 71 counter.Add(111);
72 EXPECT_EQ(1, observer->num_calls_); 72 EXPECT_EQ(1, observer->num_calls_);
73 } 73 }
74 74
75 TEST_F(StatsCounterTest, VerifyProcessInterval) { 75 TEST_F(StatsCounterTest, VerifyProcessInterval) {
76 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); 76 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
77 AvgCounter counter(&clock_, observer); 77 AvgCounter counter(&clock_, observer, false);
78 counter.Add(4); 78 counter.Add(4);
79 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1); 79 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1);
80 // Try trigger process (interval has not passed). 80 // Try trigger process (interval has not passed).
81 counter.Add(8); 81 counter.Add(8);
82 EXPECT_EQ(0, observer->num_calls_); 82 EXPECT_EQ(0, observer->num_calls_);
83 VerifyStatsIsNotSet(counter.GetStats()); 83 VerifyStatsIsNotSet(counter.GetStats());
84 // Make process interval pass. 84 // Make process interval pass.
85 clock_.AdvanceTimeMilliseconds(1); 85 clock_.AdvanceTimeMilliseconds(1);
86 // Trigger process (sample included in next interval). 86 // Trigger process (sample included in next interval).
87 counter.Add(111); 87 counter.Add(111);
88 EXPECT_EQ(1, observer->num_calls_); 88 EXPECT_EQ(1, observer->num_calls_);
89 EXPECT_EQ(6, observer->last_sample_); 89 EXPECT_EQ(6, observer->last_sample_);
90 // Aggregated stats. 90 // Aggregated stats.
91 AggregatedStats stats = counter.GetStats(); 91 AggregatedStats stats = counter.GetStats();
92 EXPECT_EQ(1, stats.num_samples); 92 EXPECT_EQ(1, stats.num_samples);
93 } 93 }
94 94
95 TEST_F(StatsCounterTest, TestMetric_AvgCounter) { 95 TEST_F(StatsCounterTest, TestMetric_AvgCounter) {
96 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); 96 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
97 AvgCounter counter(&clock_, observer); 97 AvgCounter counter(&clock_, observer, false);
98 counter.Add(4); 98 counter.Add(4);
99 counter.Add(8); 99 counter.Add(8);
100 counter.Add(9); 100 counter.Add(9);
101 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); 101 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs);
102 // Trigger process (sample included in next interval). 102 // Trigger process (sample included in next interval).
103 counter.Add(111); 103 counter.Add(111);
104 // Average per interval. 104 // Average per interval.
105 EXPECT_EQ(1, observer->num_calls_); 105 EXPECT_EQ(1, observer->num_calls_);
106 EXPECT_EQ(7, observer->last_sample_); 106 EXPECT_EQ(7, observer->last_sample_);
107 // Aggregated stats. 107 // Aggregated stats.
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 EXPECT_EQ(1, observer->num_calls_); 199 EXPECT_EQ(1, observer->num_calls_);
200 EXPECT_EQ(94, observer->last_sample_); 200 EXPECT_EQ(94, observer->last_sample_);
201 // Aggregated stats. 201 // Aggregated stats.
202 AggregatedStats stats = counter.GetStats(); 202 AggregatedStats stats = counter.GetStats();
203 EXPECT_EQ(1, stats.num_samples); 203 EXPECT_EQ(1, stats.num_samples);
204 EXPECT_EQ(94, stats.min); 204 EXPECT_EQ(94, stats.min);
205 EXPECT_EQ(94, stats.max); 205 EXPECT_EQ(94, stats.max);
206 } 206 }
207 207
208 TEST_F(StatsCounterTest, TestGetStats_MultipleIntervals) { 208 TEST_F(StatsCounterTest, TestGetStats_MultipleIntervals) {
209 AvgCounter counter(&clock_, nullptr); 209 AvgCounter counter(&clock_, nullptr, false);
210 const int kSample1 = 1; 210 const int kSample1 = 1;
211 const int kSample2 = 5; 211 const int kSample2 = 5;
212 const int kSample3 = 8; 212 const int kSample3 = 8;
213 const int kSample4 = 11; 213 const int kSample4 = 11;
214 const int kSample5 = 50; 214 const int kSample5 = 50;
215 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); 215 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter);
216 AddSampleAndAdvance(kSample2, kProcessIntervalMs, &counter); 216 AddSampleAndAdvance(kSample2, kProcessIntervalMs, &counter);
217 AddSampleAndAdvance(kSample3, kProcessIntervalMs, &counter); 217 AddSampleAndAdvance(kSample3, kProcessIntervalMs, &counter);
218 AddSampleAndAdvance(kSample4, kProcessIntervalMs, &counter); 218 AddSampleAndAdvance(kSample4, kProcessIntervalMs, &counter);
219 AddSampleAndAdvance(kSample5, kProcessIntervalMs, &counter); 219 AddSampleAndAdvance(kSample5, kProcessIntervalMs, &counter);
220 // Trigger process (sample included in next interval). 220 // Trigger process (sample included in next interval).
221 counter.Add(111); 221 counter.Add(111);
222 AggregatedStats stats = counter.GetStats(); 222 AggregatedStats stats = counter.GetStats();
223 EXPECT_EQ(5, stats.num_samples); 223 EXPECT_EQ(5, stats.num_samples);
224 EXPECT_EQ(kSample1, stats.min); 224 EXPECT_EQ(kSample1, stats.min);
225 EXPECT_EQ(kSample5, stats.max); 225 EXPECT_EQ(kSample5, stats.max);
226 EXPECT_EQ(15, stats.average); 226 EXPECT_EQ(15, stats.average);
227 } 227 }
228 228
229 TEST_F(StatsCounterTest, TestGetStatsTwice) { 229 TEST_F(StatsCounterTest, TestGetStatsTwice) {
230 const int kSample1 = 4; 230 const int kSample1 = 4;
231 const int kSample2 = 7; 231 const int kSample2 = 7;
232 AvgCounter counter(&clock_, nullptr); 232 AvgCounter counter(&clock_, nullptr, false);
233 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); 233 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter);
234 // Trigger process (sample included in next interval). 234 // Trigger process (sample included in next interval).
235 counter.Add(kSample2); 235 counter.Add(kSample2);
236 AggregatedStats stats = counter.GetStats(); 236 AggregatedStats stats = counter.GetStats();
237 EXPECT_EQ(1, stats.num_samples); 237 EXPECT_EQ(1, stats.num_samples);
238 EXPECT_EQ(kSample1, stats.min); 238 EXPECT_EQ(kSample1, stats.min);
239 EXPECT_EQ(kSample1, stats.max); 239 EXPECT_EQ(kSample1, stats.max);
240 // Trigger process (sample included in next interval). 240 // Trigger process (sample included in next interval).
241 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); 241 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs);
242 counter.Add(111); 242 counter.Add(111);
(...skipping 20 matching lines...) Expand all
263 EXPECT_EQ(2, observer->num_calls_); 263 EXPECT_EQ(2, observer->num_calls_);
264 EXPECT_EQ(300, observer->last_sample_); 264 EXPECT_EQ(300, observer->last_sample_);
265 // Aggregated stats. 265 // Aggregated stats.
266 AggregatedStats stats = counter.GetStats(); 266 AggregatedStats stats = counter.GetStats();
267 EXPECT_EQ(2, stats.num_samples); 267 EXPECT_EQ(2, stats.num_samples);
268 EXPECT_EQ(100, stats.min); 268 EXPECT_EQ(100, stats.min);
269 EXPECT_EQ(300, stats.max); 269 EXPECT_EQ(300, stats.max);
270 EXPECT_EQ(200, stats.average); 270 EXPECT_EQ(200, stats.average);
271 } 271 }
272 272
273 TEST_F(StatsCounterTest, TestAvgCounter_IntervalsWithoutSamplesIgnored) { 273 TEST_F(StatsCounterTest, TestAvgCounter_IntervalsWithoutSamplesIncluded) {
274 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); 274 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
275 AvgCounter counter(&clock_, observer); 275 AvgCounter counter(&clock_, observer, true);
276 AddSampleAndAdvance(6, kProcessIntervalMs * 4 - 1, &counter); 276 AddSampleAndAdvance(6, kProcessIntervalMs * 4 - 1, &counter);
277 // Trigger process (sample included in next interval). 277 // Trigger process (sample included in next interval).
278 counter.Add(8); 278 counter.Add(8);
279 // [6:1], two intervals without samples passed. 279 // [6:3], 3 intervals passed (2 without samples -> last value reported).
280 EXPECT_EQ(1, observer->num_calls_); 280 AggregatedStats stats = counter.ProcessAndGetStats();
281 EXPECT_EQ(3, stats.num_samples);
282 EXPECT_EQ(6, stats.min);
283 EXPECT_EQ(6, stats.max);
284 // Make next interval pass and verify stats: [6:3],[8:1]
285 clock_.AdvanceTimeMilliseconds(1);
286 counter.ProcessAndGetStats();
287 EXPECT_EQ(4, observer->num_calls_);
288 EXPECT_EQ(8, observer->last_sample_);
289 }
290
291 TEST_F(StatsCounterTest, TestAvgCounter_WithPause) {
292 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
293 AvgCounter counter(&clock_, observer, true);
294 // Add sample and advance 3 intervals (2 w/o samples -> last value reported).
295 AddSampleAndAdvance(6, kProcessIntervalMs * 4 - 1, &counter);
296 // Trigger process and verify stats: [6:3]
297 counter.ProcessAndGetStats();
298 EXPECT_EQ(3, observer->num_calls_);
281 EXPECT_EQ(6, observer->last_sample_); 299 EXPECT_EQ(6, observer->last_sample_);
282 // Make last interval pass. 300 // Make next interval pass (1 without samples).
301 // Process and pause. Verify stats: [6:4].
283 clock_.AdvanceTimeMilliseconds(1); 302 clock_.AdvanceTimeMilliseconds(1);
284 counter.Add(111); // Trigger process (sample included in next interval). 303 counter.ProcessAndPause();
285 // [6:1],[8:1] 304 EXPECT_EQ(4, observer->num_calls_); // Last value reported.
286 EXPECT_EQ(2, observer->num_calls_); 305 EXPECT_EQ(6, observer->last_sample_);
287 EXPECT_EQ(8, observer->last_sample_); 306 // Make next interval pass (1 without samples -> ignored while paused).
288 // Aggregated stats. 307 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 2 - 1);
289 AggregatedStats stats = counter.GetStats(); 308 counter.Add(22); // Stops pause.
290 EXPECT_EQ(2, stats.num_samples); 309 EXPECT_EQ(4, observer->num_calls_);
291 EXPECT_EQ(6, stats.min); 310 EXPECT_EQ(6, observer->last_sample_);
292 EXPECT_EQ(8, stats.max); 311 // Make next interval pass, [6:4][22:1]
312 clock_.AdvanceTimeMilliseconds(1);
313 counter.ProcessAndGetStats();
314 EXPECT_EQ(5, observer->num_calls_);
315 EXPECT_EQ(22, observer->last_sample_);
316 // Make 1 interval pass (1 w/o samples -> pause stopped, last value reported).
317 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs);
318 counter.ProcessAndGetStats();
319 EXPECT_EQ(6, observer->num_calls_);
320 EXPECT_EQ(22, observer->last_sample_);
293 } 321 }
294 322
295 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIgnored) { 323 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIgnored) {
296 const bool kIncludeEmptyIntervals = false; 324 const bool kIncludeEmptyIntervals = false;
297 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); 325 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
298 const int kSample1 = 50; // 50 / 2 sec 326 const int kSample1 = 50; // 50 / 2 sec
299 const int kSample2 = 20; // 20 / 2 sec 327 const int kSample2 = 20; // 20 / 2 sec
300 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); 328 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals);
301 counter.Add(kSample1); 329 counter.Add(kSample1);
302 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1); 330 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1);
303 // Trigger process (sample included in next interval). 331 // Trigger process (sample included in next interval).
304 counter.Add(kSample2); 332 counter.Add(kSample2);
305 // [25:1], one interval without samples passed. 333 // [25:1], 2 intervals passed (1 without samples -> ignored).
306 EXPECT_EQ(1, observer->num_calls_); 334 EXPECT_EQ(1, observer->num_calls_);
307 EXPECT_EQ(25, observer->last_sample_); 335 EXPECT_EQ(25, observer->last_sample_);
308 // Make last interval pass. 336 // Make next interval pass and verify stats: [10:1],[25:1]
309 clock_.AdvanceTimeMilliseconds(1); 337 clock_.AdvanceTimeMilliseconds(1);
310 counter.Add(111); // Trigger process (sample included in next interval). 338 counter.ProcessAndGetStats();
311 // [10:1],[25:1]
312 EXPECT_EQ(2, observer->num_calls_); 339 EXPECT_EQ(2, observer->num_calls_);
313 EXPECT_EQ(10, observer->last_sample_); 340 EXPECT_EQ(10, observer->last_sample_);
314 // Aggregated stats.
315 AggregatedStats stats = counter.GetStats();
316 EXPECT_EQ(2, stats.num_samples);
317 EXPECT_EQ(10, stats.min);
318 EXPECT_EQ(25, stats.max);
319 } 341 }
320 342
321 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIncluded) { 343 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIncluded) {
322 const bool kIncludeEmptyIntervals = true; 344 const bool kIncludeEmptyIntervals = true;
323 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); 345 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
324 const int kSample1 = 50; // 50 / 2 sec 346 const int kSample1 = 50; // 50 / 2 sec
325 const int kSample2 = 20; // 20 / 2 sec 347 const int kSample2 = 20; // 20 / 2 sec
326 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); 348 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals);
327 counter.Add(kSample1); 349 counter.Add(kSample1);
328 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1); 350 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1);
329 // Trigger process (sample included in next interval). 351 // Trigger process (sample included in next interval).
330 counter.Add(kSample2); 352 counter.Add(kSample2);
331 // [0:1],[25:1], one interval without samples passed. 353 // [0:1],[25:1], 2 intervals passed (1 without samples -> zero reported).
332 EXPECT_EQ(2, observer->num_calls_); 354 EXPECT_EQ(2, observer->num_calls_);
333 EXPECT_EQ(25, observer->last_sample_); 355 EXPECT_EQ(0, observer->last_sample_);
334 // Make last interval pass. 356 // Make last interval pass and verify stats: [0:1],[10:1],[25:1]
335 clock_.AdvanceTimeMilliseconds(1); 357 clock_.AdvanceTimeMilliseconds(1);
336 counter.Add(111); // Trigger process (sample included in next interval). 358 AggregatedStats stats = counter.ProcessAndGetStats();
337 // [0:1],[10:1],[25:1] 359 EXPECT_EQ(25, stats.max);
338 EXPECT_EQ(3, observer->num_calls_); 360 EXPECT_EQ(3, observer->num_calls_);
339 EXPECT_EQ(10, observer->last_sample_); 361 EXPECT_EQ(10, observer->last_sample_);
340 // Aggregated stats. 362 }
341 AggregatedStats stats = counter.GetStats(); 363
342 EXPECT_EQ(3, stats.num_samples); 364 TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIncluded) {
343 EXPECT_EQ(0, stats.min); 365 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
344 EXPECT_EQ(25, stats.max); 366 RateAccCounter counter(&clock_, observer, true);
367 VerifyStatsIsNotSet(counter.ProcessAndGetStats());
368 // Advance one interval and verify stats.
369 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs);
370 VerifyStatsIsNotSet(counter.ProcessAndGetStats());
371 // Add sample and advance 3 intervals (2 w/o samples -> zero reported).
372 counter.Set(12);
373 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 4 - 1);
374 // Trigger process and verify stats: [0:2][6:1]
375 counter.ProcessAndGetStats();
376 EXPECT_EQ(3, observer->num_calls_);
377 EXPECT_EQ(0, observer->last_sample_);
378 // Make next interval pass (1 w/o samples -> zero reported), [0:3][6:1]
379 clock_.AdvanceTimeMilliseconds(1);
380 counter.ProcessAndGetStats();
381 EXPECT_EQ(4, observer->num_calls_);
382 EXPECT_EQ(0, observer->last_sample_);
383 // Insert sample and advance non-complete interval, no change, [0:3][6:1]
384 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1);
385 counter.Set(60);
386 EXPECT_EQ(4, observer->num_calls_);
387 // Make next interval pass, [0:3][6:1][24:1]
388 clock_.AdvanceTimeMilliseconds(1);
389 AggregatedStats stats = counter.ProcessAndGetStats();
390 EXPECT_EQ(5, observer->num_calls_);
391 EXPECT_EQ(24, observer->last_sample_);
392 EXPECT_EQ(6, stats.average);
393 }
394
395 TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIgnored) {
396 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
397 RateAccCounter counter(&clock_, observer, false);
398 // Add sample and advance 3 intervals (2 w/o samples -> ignored).
399 counter.Set(12);
400 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 4 - 1);
401 // Trigger process and verify stats: [6:1]
402 counter.ProcessAndGetStats();
403 EXPECT_EQ(1, observer->num_calls_);
404 EXPECT_EQ(6, observer->last_sample_);
405 // Make next interval pass (1 w/o samples -> ignored), [6:1]
406 clock_.AdvanceTimeMilliseconds(1);
407 counter.ProcessAndGetStats();
408 EXPECT_EQ(1, observer->num_calls_);
409 // Insert sample and advance non-complete interval, no change, [6:1]
410 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1);
411 counter.Set(60);
412 counter.ProcessAndGetStats();
413 EXPECT_EQ(1, observer->num_calls_);
414 // Make next interval pass, [6:1][24:1]
415 clock_.AdvanceTimeMilliseconds(1);
416 counter.ProcessAndGetStats();
417 EXPECT_EQ(2, observer->num_calls_);
418 EXPECT_EQ(24, observer->last_sample_);
345 } 419 }
346 420
347 } // namespace webrtc 421 } // namespace webrtc
OLDNEW
« webrtc/video/stats_counter.cc ('K') | « webrtc/video/stats_counter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698