blob: b678a27a063ece1b1978f4257de8e837914b1747 [file] [log] [blame]
Bruno Rochabe388f32011-08-02 12:40:17 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <base/memory/scoped_ptr.h>
Bruno Rochabe388f32011-08-02 12:40:17 -07006#include <gmock/gmock.h>
7#include <gtest/gtest.h>
8
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -07009#include "metrics/metrics_library_mock.h"
10#include "metrics/timer.h"
11#include "metrics/timer_mock.h"
Bruno Rochabe388f32011-08-02 12:40:17 -070012
13using ::testing::_;
14using ::testing::Return;
15
16namespace chromeos_metrics {
17
repo sync06726552013-05-28 14:19:53 -070018namespace {
19const int64 kStime1MSec = 1400;
20const int64 kEtime1MSec = 3000;
21const int64 kDelta1MSec = 1600;
22
23const int64 kStime2MSec = 4200;
24const int64 kEtime2MSec = 5000;
25const int64 kDelta2MSec = 800;
26
27const int64 kStime3MSec = 6600;
28const int64 kEtime3MSec = 6800;
29const int64 kDelta3MSec = 200;
30} // namespace
31
Bruno Rochabe388f32011-08-02 12:40:17 -070032class TimerTest : public testing::Test {
33 public:
34 TimerTest() : clock_wrapper_mock_(new ClockWrapperMock()) {}
35
36 protected:
37 virtual void SetUp() {
repo sync06726552013-05-28 14:19:53 -070038 EXPECT_EQ(Timer::kTimerStopped, timer_.timer_state_);
39 stime += base::TimeDelta::FromMilliseconds(kStime1MSec);
40 etime += base::TimeDelta::FromMilliseconds(kEtime1MSec);
41 stime2 += base::TimeDelta::FromMilliseconds(kStime2MSec);
42 etime2 += base::TimeDelta::FromMilliseconds(kEtime2MSec);
43 stime3 += base::TimeDelta::FromMilliseconds(kStime3MSec);
44 etime3 += base::TimeDelta::FromMilliseconds(kEtime3MSec);
Bruno Rochabe388f32011-08-02 12:40:17 -070045 }
46
47 virtual void TearDown() {}
48
49 Timer timer_;
50 scoped_ptr<ClockWrapperMock> clock_wrapper_mock_;
repo sync06726552013-05-28 14:19:53 -070051 base::TimeTicks stime, etime, stime2, etime2, stime3, etime3;
Bruno Rochabe388f32011-08-02 12:40:17 -070052};
53
54TEST_F(TimerTest, StartStop) {
55 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
56 .WillOnce(Return(stime))
57 .WillOnce(Return(etime));
58 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
59 ASSERT_TRUE(timer_.Start());
60 ASSERT_TRUE(timer_.start_time_ == stime);
61 ASSERT_TRUE(timer_.HasStarted());
62 ASSERT_TRUE(timer_.Stop());
repo sync06726552013-05-28 14:19:53 -070063 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
64
65 base::TimeDelta elapsed_time;
66 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
67 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
68 elapsed_time.InMilliseconds());
69
Bruno Rochabe388f32011-08-02 12:40:17 -070070 ASSERT_FALSE(timer_.HasStarted());
71}
72
73TEST_F(TimerTest, ReStart) {
74 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
75 .WillOnce(Return(stime))
76 .WillOnce(Return(etime));
77 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
78 timer_.Start();
79 base::TimeTicks buffer = timer_.start_time_;
80 timer_.Start();
81 ASSERT_FALSE(timer_.start_time_ == buffer);
82}
83
84TEST_F(TimerTest, Reset) {
85 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
86 .WillOnce(Return(stime));
87 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
88 timer_.Start();
89 ASSERT_TRUE(timer_.Reset());
90 ASSERT_FALSE(timer_.HasStarted());
91}
92
93TEST_F(TimerTest, SeparatedTimers) {
Bruno Rochabe388f32011-08-02 12:40:17 -070094 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
95 .WillOnce(Return(stime))
96 .WillOnce(Return(etime))
97 .WillOnce(Return(stime2))
98 .WillOnce(Return(etime2));
99 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
100 ASSERT_TRUE(timer_.Start());
101 ASSERT_TRUE(timer_.Stop());
repo sync06726552013-05-28 14:19:53 -0700102 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
Bruno Rochabe388f32011-08-02 12:40:17 -0700103 ASSERT_TRUE(timer_.Start());
104 ASSERT_TRUE(timer_.start_time_ == stime2);
105 ASSERT_TRUE(timer_.Stop());
repo sync06726552013-05-28 14:19:53 -0700106 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta2MSec);
Bruno Rochabe388f32011-08-02 12:40:17 -0700107 ASSERT_FALSE(timer_.HasStarted());
repo sync06726552013-05-28 14:19:53 -0700108
109 base::TimeDelta elapsed_time;
110 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
111 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
112 elapsed_time.InMilliseconds());
Bruno Rochabe388f32011-08-02 12:40:17 -0700113}
114
115TEST_F(TimerTest, InvalidStop) {
116 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
117 .WillOnce(Return(stime))
118 .WillOnce(Return(etime));
119 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
120 ASSERT_FALSE(timer_.Stop());
121 // Now we try it again, but after a valid start/stop.
122 timer_.Start();
123 timer_.Stop();
124 base::TimeDelta elapsed_time = timer_.elapsed_time_;
125 ASSERT_FALSE(timer_.Stop());
126 ASSERT_TRUE(elapsed_time == timer_.elapsed_time_);
127}
128
129TEST_F(TimerTest, InvalidElapsedTime) {
130 base::TimeDelta elapsed_time;
131 ASSERT_FALSE(timer_.GetElapsedTime(&elapsed_time));
132}
133
repo sync06726552013-05-28 14:19:53 -0700134TEST_F(TimerTest, PauseStartStopResume) {
135 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
136 .WillOnce(Return(stime))
137 .WillOnce(Return(stime2))
138 .WillOnce(Return(etime2))
139 .WillOnce(Return(stime3))
140 .WillOnce(Return(etime3));
141 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
142 ASSERT_TRUE(timer_.Pause()); // Starts timer paused.
143 ASSERT_TRUE(timer_.start_time_ == stime);
144 ASSERT_TRUE(timer_.HasStarted());
145
146 ASSERT_TRUE(timer_.Start()); // Restarts timer.
147 ASSERT_TRUE(timer_.start_time_ == stime2);
148 ASSERT_TRUE(timer_.HasStarted());
149
150 ASSERT_TRUE(timer_.Stop());
151 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta2MSec);
152 ASSERT_FALSE(timer_.HasStarted());
153 base::TimeDelta elapsed_time;
154 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
155 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
156 elapsed_time.InMilliseconds());
157
158 ASSERT_TRUE(timer_.Resume());
159 ASSERT_TRUE(timer_.HasStarted());
160 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
161 ASSERT_EQ(kDelta3MSec, elapsed_time.InMilliseconds());
162}
163
164TEST_F(TimerTest, ResumeStartStopPause) {
165 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
166 .WillOnce(Return(stime))
167 .WillOnce(Return(stime2))
168 .WillOnce(Return(etime2))
169 .WillOnce(Return(stime3));
170 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
171 ASSERT_TRUE(timer_.Resume());
172 ASSERT_TRUE(timer_.start_time_ == stime);
173 ASSERT_TRUE(timer_.HasStarted());
174
175 ASSERT_TRUE(timer_.Start());
176 ASSERT_TRUE(timer_.start_time_ == stime2);
177 ASSERT_TRUE(timer_.HasStarted());
178
179 ASSERT_TRUE(timer_.Stop());
180 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta2MSec);
181 ASSERT_FALSE(timer_.HasStarted());
182 base::TimeDelta elapsed_time;
183 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
184 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
185 elapsed_time.InMilliseconds());
186
187 ASSERT_TRUE(timer_.Pause());
188 ASSERT_TRUE(timer_.HasStarted());
189 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
190 ASSERT_EQ(0, elapsed_time.InMilliseconds());
191}
192
193TEST_F(TimerTest, StartResumeStop) {
194 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
195 .WillOnce(Return(stime))
196 .WillOnce(Return(etime));
197 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
198 ASSERT_TRUE(timer_.Start());
199 ASSERT_TRUE(timer_.start_time_ == stime);
200 ASSERT_TRUE(timer_.HasStarted());
201
202 ASSERT_FALSE(timer_.Resume());
203 ASSERT_TRUE(timer_.start_time_ == stime);
204 ASSERT_TRUE(timer_.HasStarted());
205
206 ASSERT_TRUE(timer_.Stop());
207 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
208 ASSERT_FALSE(timer_.HasStarted());
209 base::TimeDelta elapsed_time;
210 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
211 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
212 elapsed_time.InMilliseconds());
213}
214
215TEST_F(TimerTest, StartPauseStop) {
216 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
217 .WillOnce(Return(stime))
218 .WillOnce(Return(etime));
219 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
220 ASSERT_TRUE(timer_.Start());
221 ASSERT_TRUE(timer_.start_time_ == stime);
222 ASSERT_TRUE(timer_.HasStarted());
223
224 ASSERT_TRUE(timer_.Pause());
225 ASSERT_TRUE(timer_.HasStarted());
226 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
227 base::TimeDelta elapsed_time;
228 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
229 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
230 elapsed_time.InMilliseconds());
231
232 ASSERT_TRUE(timer_.Stop());
233 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
234 ASSERT_FALSE(timer_.HasStarted());
235 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
236 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
237 elapsed_time.InMilliseconds());
238}
239
240TEST_F(TimerTest, StartPauseResumeStop) {
241 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
242 .WillOnce(Return(stime))
243 .WillOnce(Return(etime))
244 .WillOnce(Return(stime2))
245 .WillOnce(Return(etime2));
246 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
247 ASSERT_TRUE(timer_.Start());
248 ASSERT_TRUE(timer_.start_time_ == stime);
249 ASSERT_TRUE(timer_.HasStarted());
250
251 ASSERT_TRUE(timer_.Pause());
252 ASSERT_TRUE(timer_.HasStarted());
253 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
254 base::TimeDelta elapsed_time;
255 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
256 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
257 elapsed_time.InMilliseconds());
258
259 ASSERT_TRUE(timer_.Resume());
260 ASSERT_TRUE(timer_.HasStarted());
261
262 ASSERT_TRUE(timer_.Stop());
263 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec + kDelta2MSec);
264 ASSERT_FALSE(timer_.HasStarted());
265 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
266 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
267 elapsed_time.InMilliseconds());
268}
269
270TEST_F(TimerTest, PauseStop) {
271 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
272 .WillOnce(Return(stime));
273 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
274 ASSERT_TRUE(timer_.Pause());
275 ASSERT_TRUE(timer_.start_time_ == stime);
276 ASSERT_TRUE(timer_.HasStarted());
277 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), 0);
278
279 ASSERT_TRUE(timer_.Stop());
280 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), 0);
281 ASSERT_FALSE(timer_.HasStarted());
282 base::TimeDelta elapsed_time;
283 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
284 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
285 elapsed_time.InMilliseconds());
286}
287
288TEST_F(TimerTest, PauseResumeStop) {
289 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
290 .WillOnce(Return(stime))
291 .WillOnce(Return(stime2))
292 .WillOnce(Return(etime2));
293 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
294 ASSERT_TRUE(timer_.Pause());
295 ASSERT_TRUE(timer_.start_time_ == stime);
296 ASSERT_TRUE(timer_.HasStarted());
297
298 ASSERT_TRUE(timer_.Resume());
299 ASSERT_TRUE(timer_.HasStarted());
300
301 ASSERT_TRUE(timer_.Stop());
302 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta2MSec);
303 ASSERT_FALSE(timer_.HasStarted());
304 base::TimeDelta elapsed_time;
305 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
306 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
307 elapsed_time.InMilliseconds());
308}
309
310TEST_F(TimerTest, StartPauseResumePauseStop) {
311 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
312 .WillOnce(Return(stime))
313 .WillOnce(Return(etime))
314 .WillOnce(Return(stime2))
315 .WillOnce(Return(stime3))
316 .WillOnce(Return(etime3));
317 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
318 ASSERT_TRUE(timer_.Start());
319 ASSERT_TRUE(timer_.start_time_ == stime);
320 ASSERT_TRUE(timer_.HasStarted());
321
322 ASSERT_TRUE(timer_.Pause());
323 ASSERT_TRUE(timer_.HasStarted());
324 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
325 base::TimeDelta elapsed_time;
326 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
327 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
328 elapsed_time.InMilliseconds());
329
330 ASSERT_TRUE(timer_.Resume());
331 ASSERT_TRUE(timer_.HasStarted());
332 // Make sure GetElapsedTime works while we're running.
333 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
334 ASSERT_EQ(kDelta1MSec + kStime3MSec - kStime2MSec,
335 elapsed_time.InMilliseconds());
336
337 ASSERT_TRUE(timer_.Pause());
338 ASSERT_TRUE(timer_.HasStarted());
339 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
340 kDelta1MSec + kEtime3MSec - kStime2MSec);
341 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
342 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
343 elapsed_time.InMilliseconds());
344
345 ASSERT_TRUE(timer_.Stop());
346 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
347 kDelta1MSec + kEtime3MSec - kStime2MSec);
348 ASSERT_FALSE(timer_.HasStarted());
349 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
350 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
351 elapsed_time.InMilliseconds());
352}
353
354TEST_F(TimerTest, StartPauseResumePauseResumeStop) {
355 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
356 .WillOnce(Return(stime))
357 .WillOnce(Return(etime))
358 .WillOnce(Return(stime2))
359 .WillOnce(Return(etime2))
360 .WillOnce(Return(stime3))
361 .WillOnce(Return(etime3));
362 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
363 ASSERT_TRUE(timer_.Start());
364 ASSERT_TRUE(timer_.start_time_ == stime);
365 ASSERT_TRUE(timer_.HasStarted());
366
367 ASSERT_TRUE(timer_.Pause());
368 ASSERT_TRUE(timer_.HasStarted());
369 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
370 base::TimeDelta elapsed_time;
371 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
372 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
373 elapsed_time.InMilliseconds());
374
375 ASSERT_TRUE(timer_.Resume());
376 ASSERT_TRUE(timer_.HasStarted());
377
378 ASSERT_TRUE(timer_.Pause());
379 ASSERT_TRUE(timer_.HasStarted());
380 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec + kDelta2MSec);
381 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
382 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
383 elapsed_time.InMilliseconds());
384
385 ASSERT_TRUE(timer_.Resume());
386 ASSERT_TRUE(timer_.HasStarted());
387
388 ASSERT_TRUE(timer_.Stop());
389 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
390 kDelta1MSec + kDelta2MSec + kDelta3MSec);
391 ASSERT_FALSE(timer_.HasStarted());
392 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
393 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
394 elapsed_time.InMilliseconds());
395}
396
Bruno Rochabe388f32011-08-02 12:40:17 -0700397static const char kMetricName[] = "test-timer";
398static const int kMinSample = 0;
399static const int kMaxSample = 120 * 1E6;
400static const int kNumBuckets = 50;
401
402class TimerReporterTest : public testing::Test {
403 public:
404 TimerReporterTest() : timer_reporter_(kMetricName, kMinSample, kMaxSample,
405 kNumBuckets),
406 clock_wrapper_mock_(new ClockWrapperMock()) {}
407
408 protected:
409 virtual void SetUp() {
410 timer_reporter_.set_metrics_lib(&lib_);
411 EXPECT_EQ(timer_reporter_.histogram_name_, kMetricName);
412 EXPECT_EQ(timer_reporter_.min_, kMinSample);
413 EXPECT_EQ(timer_reporter_.max_, kMaxSample);
414 EXPECT_EQ(timer_reporter_.num_buckets_, kNumBuckets);
repo sync06726552013-05-28 14:19:53 -0700415 stime += base::TimeDelta::FromMilliseconds(kStime1MSec);
416 etime += base::TimeDelta::FromMilliseconds(kEtime1MSec);
Bruno Rochabe388f32011-08-02 12:40:17 -0700417 }
418
419 virtual void TearDown() {
420 timer_reporter_.set_metrics_lib(NULL);
421 }
422
423 TimerReporter timer_reporter_;
424 MetricsLibraryMock lib_;
425 scoped_ptr<ClockWrapperMock> clock_wrapper_mock_;
426 base::TimeTicks stime, etime;
427};
428
429TEST_F(TimerReporterTest, StartStopReport) {
430 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
431 .WillOnce(Return(stime))
432 .WillOnce(Return(etime));
433 timer_reporter_.clock_wrapper_.reset(clock_wrapper_mock_.release());
repo sync06726552013-05-28 14:19:53 -0700434 EXPECT_CALL(lib_, SendToUMA(kMetricName, kDelta1MSec, kMinSample, kMaxSample,
Bruno Rochabe388f32011-08-02 12:40:17 -0700435 kNumBuckets)).WillOnce(Return(true));
436 ASSERT_TRUE(timer_reporter_.Start());
437 ASSERT_TRUE(timer_reporter_.Stop());
438 ASSERT_TRUE(timer_reporter_.ReportMilliseconds());
439}
440
441TEST_F(TimerReporterTest, InvalidReport) {
442 ASSERT_FALSE(timer_reporter_.ReportMilliseconds());
443}
444
445} // namespace chromeos_metrics
446
447int main(int argc, char **argv) {
448 testing::InitGoogleTest(&argc, argv);
449 return RUN_ALL_TESTS();
450}