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

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

Issue 2388043003: Make process interval configurable for MaxCounter class. (Closed)
Patch Set: Created 4 years, 2 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
« no previous file with comments | « 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
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
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
OLDNEW
« no previous file with comments | « webrtc/video/stats_counter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698