| 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 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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, HasSample) { | 75 TEST_F(StatsCounterTest, HasSample) { |
| 76 AvgCounter counter(&clock_, nullptr); | 76 AvgCounter counter(&clock_, nullptr, false); |
| 77 EXPECT_FALSE(counter.HasSample()); | 77 EXPECT_FALSE(counter.HasSample()); |
| 78 counter.Add(1); | 78 counter.Add(1); |
| 79 EXPECT_TRUE(counter.HasSample()); | 79 EXPECT_TRUE(counter.HasSample()); |
| 80 } | 80 } |
| 81 | 81 |
| 82 TEST_F(StatsCounterTest, VerifyProcessInterval) { | 82 TEST_F(StatsCounterTest, VerifyProcessInterval) { |
| 83 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 83 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
| 84 AvgCounter counter(&clock_, observer); | 84 AvgCounter counter(&clock_, observer, false); |
| 85 counter.Add(4); | 85 counter.Add(4); |
| 86 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1); | 86 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1); |
| 87 // Try trigger process (interval has not passed). | 87 // Try trigger process (interval has not passed). |
| 88 counter.Add(8); | 88 counter.Add(8); |
| 89 EXPECT_EQ(0, observer->num_calls_); | 89 EXPECT_EQ(0, observer->num_calls_); |
| 90 VerifyStatsIsNotSet(counter.GetStats()); | 90 VerifyStatsIsNotSet(counter.GetStats()); |
| 91 // Make process interval pass. | 91 // Make process interval pass. |
| 92 clock_.AdvanceTimeMilliseconds(1); | 92 clock_.AdvanceTimeMilliseconds(1); |
| 93 // Trigger process (sample included in next interval). | 93 // Trigger process (sample included in next interval). |
| 94 counter.Add(111); | 94 counter.Add(111); |
| 95 EXPECT_EQ(1, observer->num_calls_); | 95 EXPECT_EQ(1, observer->num_calls_); |
| 96 EXPECT_EQ(6, observer->last_sample_); | 96 EXPECT_EQ(6, observer->last_sample_); |
| 97 // Aggregated stats. | 97 // Aggregated stats. |
| 98 AggregatedStats stats = counter.GetStats(); | 98 AggregatedStats stats = counter.GetStats(); |
| 99 EXPECT_EQ(1, stats.num_samples); | 99 EXPECT_EQ(1, stats.num_samples); |
| 100 } | 100 } |
| 101 | 101 |
| 102 TEST_F(StatsCounterTest, TestMetric_AvgCounter) { | 102 TEST_F(StatsCounterTest, TestMetric_AvgCounter) { |
| 103 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 103 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
| 104 AvgCounter counter(&clock_, observer); | 104 AvgCounter counter(&clock_, observer, false); |
| 105 counter.Add(4); | 105 counter.Add(4); |
| 106 counter.Add(8); | 106 counter.Add(8); |
| 107 counter.Add(9); | 107 counter.Add(9); |
| 108 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 108 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); |
| 109 // Trigger process (sample included in next interval). | 109 // Trigger process (sample included in next interval). |
| 110 counter.Add(111); | 110 counter.Add(111); |
| 111 // Average per interval. | 111 // Average per interval. |
| 112 EXPECT_EQ(1, observer->num_calls_); | 112 EXPECT_EQ(1, observer->num_calls_); |
| 113 EXPECT_EQ(7, observer->last_sample_); | 113 EXPECT_EQ(7, observer->last_sample_); |
| 114 // Aggregated stats. | 114 // Aggregated stats. |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 EXPECT_EQ(1, observer->num_calls_); | 206 EXPECT_EQ(1, observer->num_calls_); |
| 207 EXPECT_EQ(94, observer->last_sample_); | 207 EXPECT_EQ(94, observer->last_sample_); |
| 208 // Aggregated stats. | 208 // Aggregated stats. |
| 209 AggregatedStats stats = counter.GetStats(); | 209 AggregatedStats stats = counter.GetStats(); |
| 210 EXPECT_EQ(1, stats.num_samples); | 210 EXPECT_EQ(1, stats.num_samples); |
| 211 EXPECT_EQ(94, stats.min); | 211 EXPECT_EQ(94, stats.min); |
| 212 EXPECT_EQ(94, stats.max); | 212 EXPECT_EQ(94, stats.max); |
| 213 } | 213 } |
| 214 | 214 |
| 215 TEST_F(StatsCounterTest, TestGetStats_MultipleIntervals) { | 215 TEST_F(StatsCounterTest, TestGetStats_MultipleIntervals) { |
| 216 AvgCounter counter(&clock_, nullptr); | 216 AvgCounter counter(&clock_, nullptr, false); |
| 217 const int kSample1 = 1; | 217 const int kSample1 = 1; |
| 218 const int kSample2 = 5; | 218 const int kSample2 = 5; |
| 219 const int kSample3 = 8; | 219 const int kSample3 = 8; |
| 220 const int kSample4 = 11; | 220 const int kSample4 = 11; |
| 221 const int kSample5 = 50; | 221 const int kSample5 = 50; |
| 222 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); | 222 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); |
| 223 AddSampleAndAdvance(kSample2, kProcessIntervalMs, &counter); | 223 AddSampleAndAdvance(kSample2, kProcessIntervalMs, &counter); |
| 224 AddSampleAndAdvance(kSample3, kProcessIntervalMs, &counter); | 224 AddSampleAndAdvance(kSample3, kProcessIntervalMs, &counter); |
| 225 AddSampleAndAdvance(kSample4, kProcessIntervalMs, &counter); | 225 AddSampleAndAdvance(kSample4, kProcessIntervalMs, &counter); |
| 226 AddSampleAndAdvance(kSample5, kProcessIntervalMs, &counter); | 226 AddSampleAndAdvance(kSample5, kProcessIntervalMs, &counter); |
| 227 // Trigger process (sample included in next interval). | 227 // Trigger process (sample included in next interval). |
| 228 counter.Add(111); | 228 counter.Add(111); |
| 229 AggregatedStats stats = counter.GetStats(); | 229 AggregatedStats stats = counter.GetStats(); |
| 230 EXPECT_EQ(5, stats.num_samples); | 230 EXPECT_EQ(5, stats.num_samples); |
| 231 EXPECT_EQ(kSample1, stats.min); | 231 EXPECT_EQ(kSample1, stats.min); |
| 232 EXPECT_EQ(kSample5, stats.max); | 232 EXPECT_EQ(kSample5, stats.max); |
| 233 EXPECT_EQ(15, stats.average); | 233 EXPECT_EQ(15, stats.average); |
| 234 } | 234 } |
| 235 | 235 |
| 236 TEST_F(StatsCounterTest, TestGetStatsTwice) { | 236 TEST_F(StatsCounterTest, TestGetStatsTwice) { |
| 237 const int kSample1 = 4; | 237 const int kSample1 = 4; |
| 238 const int kSample2 = 7; | 238 const int kSample2 = 7; |
| 239 AvgCounter counter(&clock_, nullptr); | 239 AvgCounter counter(&clock_, nullptr, false); |
| 240 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); | 240 AddSampleAndAdvance(kSample1, kProcessIntervalMs, &counter); |
| 241 // Trigger process (sample included in next interval). | 241 // Trigger process (sample included in next interval). |
| 242 counter.Add(kSample2); | 242 counter.Add(kSample2); |
| 243 AggregatedStats stats = counter.GetStats(); | 243 AggregatedStats stats = counter.GetStats(); |
| 244 EXPECT_EQ(1, stats.num_samples); | 244 EXPECT_EQ(1, stats.num_samples); |
| 245 EXPECT_EQ(kSample1, stats.min); | 245 EXPECT_EQ(kSample1, stats.min); |
| 246 EXPECT_EQ(kSample1, stats.max); | 246 EXPECT_EQ(kSample1, stats.max); |
| 247 // Trigger process (sample included in next interval). | 247 // Trigger process (sample included in next interval). |
| 248 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); | 248 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); |
| 249 counter.Add(111); | 249 counter.Add(111); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 270 EXPECT_EQ(2, observer->num_calls_); | 270 EXPECT_EQ(2, observer->num_calls_); |
| 271 EXPECT_EQ(300, observer->last_sample_); | 271 EXPECT_EQ(300, observer->last_sample_); |
| 272 // Aggregated stats. | 272 // Aggregated stats. |
| 273 AggregatedStats stats = counter.GetStats(); | 273 AggregatedStats stats = counter.GetStats(); |
| 274 EXPECT_EQ(2, stats.num_samples); | 274 EXPECT_EQ(2, stats.num_samples); |
| 275 EXPECT_EQ(100, stats.min); | 275 EXPECT_EQ(100, stats.min); |
| 276 EXPECT_EQ(300, stats.max); | 276 EXPECT_EQ(300, stats.max); |
| 277 EXPECT_EQ(200, stats.average); | 277 EXPECT_EQ(200, stats.average); |
| 278 } | 278 } |
| 279 | 279 |
| 280 TEST_F(StatsCounterTest, TestAvgCounter_IntervalsWithoutSamplesIgnored) { | 280 TEST_F(StatsCounterTest, TestAvgCounter_IntervalsWithoutSamplesIncluded) { |
| 281 // Samples: | 6 | x | x | 8 | // x: empty interval |
| 282 // Stats: | 6 | 6 | 6 | 8 | // x -> last value reported |
| 281 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 283 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
| 282 AvgCounter counter(&clock_, observer); | 284 AvgCounter counter(&clock_, observer, true); |
| 283 AddSampleAndAdvance(6, kProcessIntervalMs * 4 - 1, &counter); | 285 AddSampleAndAdvance(6, kProcessIntervalMs * 4 - 1, &counter); |
| 284 // Trigger process (sample included in next interval). | 286 // Trigger process (sample included in next interval). |
| 285 counter.Add(8); | 287 counter.Add(8); |
| 286 // [6:1], two intervals without samples passed. | 288 // [6:3], 3 intervals passed (2 without samples -> last value reported). |
| 287 EXPECT_EQ(1, observer->num_calls_); | 289 AggregatedStats stats = counter.ProcessAndGetStats(); |
| 290 EXPECT_EQ(3, stats.num_samples); |
| 291 EXPECT_EQ(6, stats.min); |
| 292 EXPECT_EQ(6, stats.max); |
| 293 // Make next interval pass and verify stats: [6:3],[8:1] |
| 294 clock_.AdvanceTimeMilliseconds(1); |
| 295 counter.ProcessAndGetStats(); |
| 296 EXPECT_EQ(4, observer->num_calls_); |
| 297 EXPECT_EQ(8, observer->last_sample_); |
| 298 } |
| 299 |
| 300 TEST_F(StatsCounterTest, TestAvgCounter_WithPause) { |
| 301 // Samples: | 6 | x | x | x | - | 22 | x | // x: empty interval, -: paused |
| 302 // Stats: | 6 | 6 | 6 | 6 | - | 22 | 22 | // x -> last value reported |
| 303 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
| 304 AvgCounter counter(&clock_, observer, true); |
| 305 // Add sample and advance 3 intervals (2 w/o samples -> last value reported). |
| 306 AddSampleAndAdvance(6, kProcessIntervalMs * 4 - 1, &counter); |
| 307 // Trigger process and verify stats: [6:3] |
| 308 counter.ProcessAndGetStats(); |
| 309 EXPECT_EQ(3, observer->num_calls_); |
| 288 EXPECT_EQ(6, observer->last_sample_); | 310 EXPECT_EQ(6, observer->last_sample_); |
| 289 // Make last interval pass. | 311 // Make next interval pass (1 without samples). |
| 312 // Process and pause. Verify stats: [6:4]. |
| 290 clock_.AdvanceTimeMilliseconds(1); | 313 clock_.AdvanceTimeMilliseconds(1); |
| 291 counter.Add(111); // Trigger process (sample included in next interval). | 314 counter.ProcessAndPause(); |
| 292 // [6:1],[8:1] | 315 EXPECT_EQ(4, observer->num_calls_); // Last value reported. |
| 293 EXPECT_EQ(2, observer->num_calls_); | 316 EXPECT_EQ(6, observer->last_sample_); |
| 294 EXPECT_EQ(8, observer->last_sample_); | 317 // Make next interval pass (1 without samples -> ignored while paused). |
| 295 // Aggregated stats. | 318 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 2 - 1); |
| 296 AggregatedStats stats = counter.GetStats(); | 319 counter.Add(22); // Stops pause. |
| 297 EXPECT_EQ(2, stats.num_samples); | 320 EXPECT_EQ(4, observer->num_calls_); |
| 298 EXPECT_EQ(6, stats.min); | 321 EXPECT_EQ(6, observer->last_sample_); |
| 299 EXPECT_EQ(8, stats.max); | 322 // Make next interval pass, [6:4][22:1] |
| 323 clock_.AdvanceTimeMilliseconds(1); |
| 324 counter.ProcessAndGetStats(); |
| 325 EXPECT_EQ(5, observer->num_calls_); |
| 326 EXPECT_EQ(22, observer->last_sample_); |
| 327 // Make 1 interval pass (1 w/o samples -> pause stopped, last value reported). |
| 328 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); |
| 329 counter.ProcessAndGetStats(); |
| 330 EXPECT_EQ(6, observer->num_calls_); |
| 331 EXPECT_EQ(22, observer->last_sample_); |
| 300 } | 332 } |
| 301 | 333 |
| 302 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIgnored) { | 334 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIgnored) { |
| 335 // Samples: | 50 | x | 20 | // x: empty interval |
| 336 // Stats: | 25 | x | 10 | // x -> ignored |
| 303 const bool kIncludeEmptyIntervals = false; | 337 const bool kIncludeEmptyIntervals = false; |
| 304 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 338 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
| 305 const int kSample1 = 50; // 50 / 2 sec | 339 const int kSample1 = 50; // 50 / 2 sec |
| 306 const int kSample2 = 20; // 20 / 2 sec | 340 const int kSample2 = 20; // 20 / 2 sec |
| 307 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); | 341 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); |
| 308 counter.Add(kSample1); | 342 counter.Add(kSample1); |
| 309 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1); | 343 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1); |
| 310 // Trigger process (sample included in next interval). | 344 // Trigger process (sample included in next interval). |
| 311 counter.Add(kSample2); | 345 counter.Add(kSample2); |
| 312 // [25:1], one interval without samples passed. | 346 // [25:1], 2 intervals passed (1 without samples -> ignored). |
| 313 EXPECT_EQ(1, observer->num_calls_); | 347 EXPECT_EQ(1, observer->num_calls_); |
| 314 EXPECT_EQ(25, observer->last_sample_); | 348 EXPECT_EQ(25, observer->last_sample_); |
| 315 // Make last interval pass. | 349 // Make next interval pass and verify stats: [10:1],[25:1] |
| 316 clock_.AdvanceTimeMilliseconds(1); | 350 clock_.AdvanceTimeMilliseconds(1); |
| 317 counter.Add(111); // Trigger process (sample included in next interval). | 351 counter.ProcessAndGetStats(); |
| 318 // [10:1],[25:1] | |
| 319 EXPECT_EQ(2, observer->num_calls_); | 352 EXPECT_EQ(2, observer->num_calls_); |
| 320 EXPECT_EQ(10, observer->last_sample_); | 353 EXPECT_EQ(10, observer->last_sample_); |
| 321 // Aggregated stats. | |
| 322 AggregatedStats stats = counter.GetStats(); | |
| 323 EXPECT_EQ(2, stats.num_samples); | |
| 324 EXPECT_EQ(10, stats.min); | |
| 325 EXPECT_EQ(25, stats.max); | |
| 326 } | 354 } |
| 327 | 355 |
| 328 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIncluded) { | 356 TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIncluded) { |
| 357 // Samples: | 50 | x | 20 | // x: empty interval |
| 358 // Stats: | 25 | 0 | 10 | // x -> zero reported |
| 329 const bool kIncludeEmptyIntervals = true; | 359 const bool kIncludeEmptyIntervals = true; |
| 330 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); | 360 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
| 331 const int kSample1 = 50; // 50 / 2 sec | 361 const int kSample1 = 50; // 50 / 2 sec |
| 332 const int kSample2 = 20; // 20 / 2 sec | 362 const int kSample2 = 20; // 20 / 2 sec |
| 333 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); | 363 RateCounter counter(&clock_, observer, kIncludeEmptyIntervals); |
| 334 counter.Add(kSample1); | 364 counter.Add(kSample1); |
| 335 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1); | 365 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 3 - 1); |
| 336 // Trigger process (sample included in next interval). | 366 // Trigger process (sample included in next interval). |
| 337 counter.Add(kSample2); | 367 counter.Add(kSample2); |
| 338 // [0:1],[25:1], one interval without samples passed. | 368 // [0:1],[25:1], 2 intervals passed (1 without samples -> zero reported). |
| 339 EXPECT_EQ(2, observer->num_calls_); | 369 EXPECT_EQ(2, observer->num_calls_); |
| 340 EXPECT_EQ(25, observer->last_sample_); | 370 EXPECT_EQ(0, observer->last_sample_); |
| 341 // Make last interval pass. | 371 // Make last interval pass and verify stats: [0:1],[10:1],[25:1] |
| 342 clock_.AdvanceTimeMilliseconds(1); | 372 clock_.AdvanceTimeMilliseconds(1); |
| 343 counter.Add(111); // Trigger process (sample included in next interval). | 373 AggregatedStats stats = counter.ProcessAndGetStats(); |
| 344 // [0:1],[10:1],[25:1] | 374 EXPECT_EQ(25, stats.max); |
| 345 EXPECT_EQ(3, observer->num_calls_); | 375 EXPECT_EQ(3, observer->num_calls_); |
| 346 EXPECT_EQ(10, observer->last_sample_); | 376 EXPECT_EQ(10, observer->last_sample_); |
| 347 // Aggregated stats. | 377 } |
| 348 AggregatedStats stats = counter.GetStats(); | 378 |
| 349 EXPECT_EQ(3, stats.num_samples); | 379 TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIncluded) { |
| 350 EXPECT_EQ(0, stats.min); | 380 // Samples: | 12 | x | x | x | 60 | // x: empty interval |
| 351 EXPECT_EQ(25, stats.max); | 381 // Stats: | 6 | 0 | 0 | 0 | 24 | // x -> zero reported |
| 382 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
| 383 RateAccCounter counter(&clock_, observer, true); |
| 384 VerifyStatsIsNotSet(counter.ProcessAndGetStats()); |
| 385 // Advance one interval and verify stats. |
| 386 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs); |
| 387 VerifyStatsIsNotSet(counter.ProcessAndGetStats()); |
| 388 // Add sample and advance 3 intervals (2 w/o samples -> zero reported). |
| 389 counter.Set(12); |
| 390 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 4 - 1); |
| 391 // Trigger process and verify stats: [0:2][6:1] |
| 392 counter.ProcessAndGetStats(); |
| 393 EXPECT_EQ(3, observer->num_calls_); |
| 394 EXPECT_EQ(0, observer->last_sample_); |
| 395 // Make next interval pass (1 w/o samples -> zero reported), [0:3][6:1] |
| 396 clock_.AdvanceTimeMilliseconds(1); |
| 397 counter.ProcessAndGetStats(); |
| 398 EXPECT_EQ(4, observer->num_calls_); |
| 399 EXPECT_EQ(0, observer->last_sample_); |
| 400 // Insert sample and advance non-complete interval, no change, [0:3][6:1] |
| 401 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1); |
| 402 counter.Set(60); |
| 403 EXPECT_EQ(4, observer->num_calls_); |
| 404 // Make next interval pass, [0:3][6:1][24:1] |
| 405 clock_.AdvanceTimeMilliseconds(1); |
| 406 AggregatedStats stats = counter.ProcessAndGetStats(); |
| 407 EXPECT_EQ(5, observer->num_calls_); |
| 408 EXPECT_EQ(24, observer->last_sample_); |
| 409 EXPECT_EQ(6, stats.average); |
| 410 } |
| 411 |
| 412 TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIgnored) { |
| 413 // Samples: | 12 | x | x | x | 60 | // x: empty interval |
| 414 // Stats: | 6 | x | x | x | 24 | // x -> ignored |
| 415 StatsCounterObserverImpl* observer = new StatsCounterObserverImpl(); |
| 416 RateAccCounter counter(&clock_, observer, false); |
| 417 // Add sample and advance 3 intervals (2 w/o samples -> ignored). |
| 418 counter.Set(12); |
| 419 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs * 4 - 1); |
| 420 // Trigger process and verify stats: [6:1] |
| 421 counter.ProcessAndGetStats(); |
| 422 EXPECT_EQ(1, observer->num_calls_); |
| 423 EXPECT_EQ(6, observer->last_sample_); |
| 424 // Make next interval pass (1 w/o samples -> ignored), [6:1] |
| 425 clock_.AdvanceTimeMilliseconds(1); |
| 426 counter.ProcessAndGetStats(); |
| 427 EXPECT_EQ(1, observer->num_calls_); |
| 428 // Insert sample and advance non-complete interval, no change, [6:1] |
| 429 clock_.AdvanceTimeMilliseconds(kProcessIntervalMs - 1); |
| 430 counter.Set(60); |
| 431 counter.ProcessAndGetStats(); |
| 432 EXPECT_EQ(1, observer->num_calls_); |
| 433 // Make next interval pass, [6:1][24:1] |
| 434 clock_.AdvanceTimeMilliseconds(1); |
| 435 counter.ProcessAndGetStats(); |
| 436 EXPECT_EQ(2, observer->num_calls_); |
| 437 EXPECT_EQ(24, observer->last_sample_); |
| 352 } | 438 } |
| 353 | 439 |
| 354 } // namespace webrtc | 440 } // namespace webrtc |
| OLD | NEW |