blob: b1689bf8cf6482320de6cade0313a9623121ba9a [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
Ben Chanf05ab402014-08-07 00:54:59 -07005#include <stdint.h>
6
Bruno Rochabe388f32011-08-02 12:40:17 -07007#include <base/memory/scoped_ptr.h>
Bruno Rochabe388f32011-08-02 12:40:17 -07008#include <gmock/gmock.h>
9#include <gtest/gtest.h>
10
Bertrand SIMONNET4b915ae2015-07-28 15:38:14 -070011#include "metrics_library_mock.h"
12#include "timer.h"
13#include "timer_mock.h"
Bruno Rochabe388f32011-08-02 12:40:17 -070014
15using ::testing::_;
16using ::testing::Return;
17
18namespace chromeos_metrics {
19
repo sync06726552013-05-28 14:19:53 -070020namespace {
Ben Chanf05ab402014-08-07 00:54:59 -070021const int64_t kStime1MSec = 1400;
22const int64_t kEtime1MSec = 3000;
23const int64_t kDelta1MSec = 1600;
repo sync06726552013-05-28 14:19:53 -070024
Ben Chanf05ab402014-08-07 00:54:59 -070025const int64_t kStime2MSec = 4200;
26const int64_t kEtime2MSec = 5000;
27const int64_t kDelta2MSec = 800;
repo sync06726552013-05-28 14:19:53 -070028
Ben Chanf05ab402014-08-07 00:54:59 -070029const int64_t kStime3MSec = 6600;
30const int64_t kEtime3MSec = 6800;
31const int64_t kDelta3MSec = 200;
repo sync06726552013-05-28 14:19:53 -070032} // namespace
33
Bruno Rochabe388f32011-08-02 12:40:17 -070034class TimerTest : public testing::Test {
35 public:
36 TimerTest() : clock_wrapper_mock_(new ClockWrapperMock()) {}
37
38 protected:
39 virtual void SetUp() {
repo sync06726552013-05-28 14:19:53 -070040 EXPECT_EQ(Timer::kTimerStopped, timer_.timer_state_);
41 stime += base::TimeDelta::FromMilliseconds(kStime1MSec);
42 etime += base::TimeDelta::FromMilliseconds(kEtime1MSec);
43 stime2 += base::TimeDelta::FromMilliseconds(kStime2MSec);
44 etime2 += base::TimeDelta::FromMilliseconds(kEtime2MSec);
45 stime3 += base::TimeDelta::FromMilliseconds(kStime3MSec);
46 etime3 += base::TimeDelta::FromMilliseconds(kEtime3MSec);
Bruno Rochabe388f32011-08-02 12:40:17 -070047 }
48
49 virtual void TearDown() {}
50
51 Timer timer_;
52 scoped_ptr<ClockWrapperMock> clock_wrapper_mock_;
repo sync06726552013-05-28 14:19:53 -070053 base::TimeTicks stime, etime, stime2, etime2, stime3, etime3;
Bruno Rochabe388f32011-08-02 12:40:17 -070054};
55
56TEST_F(TimerTest, StartStop) {
57 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
58 .WillOnce(Return(stime))
59 .WillOnce(Return(etime));
60 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
61 ASSERT_TRUE(timer_.Start());
62 ASSERT_TRUE(timer_.start_time_ == stime);
63 ASSERT_TRUE(timer_.HasStarted());
64 ASSERT_TRUE(timer_.Stop());
repo sync06726552013-05-28 14:19:53 -070065 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
66
67 base::TimeDelta elapsed_time;
68 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
69 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
70 elapsed_time.InMilliseconds());
71
Bruno Rochabe388f32011-08-02 12:40:17 -070072 ASSERT_FALSE(timer_.HasStarted());
73}
74
75TEST_F(TimerTest, ReStart) {
76 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
77 .WillOnce(Return(stime))
78 .WillOnce(Return(etime));
79 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
80 timer_.Start();
81 base::TimeTicks buffer = timer_.start_time_;
82 timer_.Start();
83 ASSERT_FALSE(timer_.start_time_ == buffer);
84}
85
86TEST_F(TimerTest, Reset) {
87 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
88 .WillOnce(Return(stime));
89 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
90 timer_.Start();
91 ASSERT_TRUE(timer_.Reset());
92 ASSERT_FALSE(timer_.HasStarted());
93}
94
95TEST_F(TimerTest, SeparatedTimers) {
Bruno Rochabe388f32011-08-02 12:40:17 -070096 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
97 .WillOnce(Return(stime))
98 .WillOnce(Return(etime))
99 .WillOnce(Return(stime2))
100 .WillOnce(Return(etime2));
101 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
102 ASSERT_TRUE(timer_.Start());
103 ASSERT_TRUE(timer_.Stop());
repo sync06726552013-05-28 14:19:53 -0700104 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
Bruno Rochabe388f32011-08-02 12:40:17 -0700105 ASSERT_TRUE(timer_.Start());
106 ASSERT_TRUE(timer_.start_time_ == stime2);
107 ASSERT_TRUE(timer_.Stop());
repo sync06726552013-05-28 14:19:53 -0700108 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta2MSec);
Bruno Rochabe388f32011-08-02 12:40:17 -0700109 ASSERT_FALSE(timer_.HasStarted());
repo sync06726552013-05-28 14:19:53 -0700110
111 base::TimeDelta elapsed_time;
112 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
113 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
114 elapsed_time.InMilliseconds());
Bruno Rochabe388f32011-08-02 12:40:17 -0700115}
116
117TEST_F(TimerTest, InvalidStop) {
118 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
119 .WillOnce(Return(stime))
120 .WillOnce(Return(etime));
121 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
122 ASSERT_FALSE(timer_.Stop());
123 // Now we try it again, but after a valid start/stop.
124 timer_.Start();
125 timer_.Stop();
126 base::TimeDelta elapsed_time = timer_.elapsed_time_;
127 ASSERT_FALSE(timer_.Stop());
128 ASSERT_TRUE(elapsed_time == timer_.elapsed_time_);
129}
130
131TEST_F(TimerTest, InvalidElapsedTime) {
132 base::TimeDelta elapsed_time;
133 ASSERT_FALSE(timer_.GetElapsedTime(&elapsed_time));
134}
135
repo sync06726552013-05-28 14:19:53 -0700136TEST_F(TimerTest, PauseStartStopResume) {
137 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
138 .WillOnce(Return(stime))
139 .WillOnce(Return(stime2))
140 .WillOnce(Return(etime2))
141 .WillOnce(Return(stime3))
142 .WillOnce(Return(etime3));
143 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
144 ASSERT_TRUE(timer_.Pause()); // Starts timer paused.
145 ASSERT_TRUE(timer_.start_time_ == stime);
146 ASSERT_TRUE(timer_.HasStarted());
147
148 ASSERT_TRUE(timer_.Start()); // Restarts timer.
149 ASSERT_TRUE(timer_.start_time_ == stime2);
150 ASSERT_TRUE(timer_.HasStarted());
151
152 ASSERT_TRUE(timer_.Stop());
153 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta2MSec);
154 ASSERT_FALSE(timer_.HasStarted());
155 base::TimeDelta elapsed_time;
156 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
157 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
158 elapsed_time.InMilliseconds());
159
160 ASSERT_TRUE(timer_.Resume());
161 ASSERT_TRUE(timer_.HasStarted());
162 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
163 ASSERT_EQ(kDelta3MSec, elapsed_time.InMilliseconds());
164}
165
166TEST_F(TimerTest, ResumeStartStopPause) {
167 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
168 .WillOnce(Return(stime))
169 .WillOnce(Return(stime2))
170 .WillOnce(Return(etime2))
171 .WillOnce(Return(stime3));
172 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
173 ASSERT_TRUE(timer_.Resume());
174 ASSERT_TRUE(timer_.start_time_ == stime);
175 ASSERT_TRUE(timer_.HasStarted());
176
177 ASSERT_TRUE(timer_.Start());
178 ASSERT_TRUE(timer_.start_time_ == stime2);
179 ASSERT_TRUE(timer_.HasStarted());
180
181 ASSERT_TRUE(timer_.Stop());
182 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta2MSec);
183 ASSERT_FALSE(timer_.HasStarted());
184 base::TimeDelta elapsed_time;
185 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
186 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
187 elapsed_time.InMilliseconds());
188
189 ASSERT_TRUE(timer_.Pause());
190 ASSERT_TRUE(timer_.HasStarted());
191 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
192 ASSERT_EQ(0, elapsed_time.InMilliseconds());
193}
194
195TEST_F(TimerTest, StartResumeStop) {
196 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
197 .WillOnce(Return(stime))
198 .WillOnce(Return(etime));
199 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
200 ASSERT_TRUE(timer_.Start());
201 ASSERT_TRUE(timer_.start_time_ == stime);
202 ASSERT_TRUE(timer_.HasStarted());
203
204 ASSERT_FALSE(timer_.Resume());
205 ASSERT_TRUE(timer_.start_time_ == stime);
206 ASSERT_TRUE(timer_.HasStarted());
207
208 ASSERT_TRUE(timer_.Stop());
209 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
210 ASSERT_FALSE(timer_.HasStarted());
211 base::TimeDelta elapsed_time;
212 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
213 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
214 elapsed_time.InMilliseconds());
215}
216
217TEST_F(TimerTest, StartPauseStop) {
218 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
219 .WillOnce(Return(stime))
220 .WillOnce(Return(etime));
221 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
222 ASSERT_TRUE(timer_.Start());
223 ASSERT_TRUE(timer_.start_time_ == stime);
224 ASSERT_TRUE(timer_.HasStarted());
225
226 ASSERT_TRUE(timer_.Pause());
227 ASSERT_TRUE(timer_.HasStarted());
228 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
229 base::TimeDelta elapsed_time;
230 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
231 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
232 elapsed_time.InMilliseconds());
233
234 ASSERT_TRUE(timer_.Stop());
235 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
236 ASSERT_FALSE(timer_.HasStarted());
237 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
238 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
239 elapsed_time.InMilliseconds());
240}
241
242TEST_F(TimerTest, StartPauseResumeStop) {
243 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
244 .WillOnce(Return(stime))
245 .WillOnce(Return(etime))
246 .WillOnce(Return(stime2))
247 .WillOnce(Return(etime2));
248 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
249 ASSERT_TRUE(timer_.Start());
250 ASSERT_TRUE(timer_.start_time_ == stime);
251 ASSERT_TRUE(timer_.HasStarted());
252
253 ASSERT_TRUE(timer_.Pause());
254 ASSERT_TRUE(timer_.HasStarted());
255 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
256 base::TimeDelta elapsed_time;
257 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
258 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
259 elapsed_time.InMilliseconds());
260
261 ASSERT_TRUE(timer_.Resume());
262 ASSERT_TRUE(timer_.HasStarted());
263
264 ASSERT_TRUE(timer_.Stop());
265 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec + kDelta2MSec);
266 ASSERT_FALSE(timer_.HasStarted());
267 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
268 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
269 elapsed_time.InMilliseconds());
270}
271
272TEST_F(TimerTest, PauseStop) {
273 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
274 .WillOnce(Return(stime));
275 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
276 ASSERT_TRUE(timer_.Pause());
277 ASSERT_TRUE(timer_.start_time_ == stime);
278 ASSERT_TRUE(timer_.HasStarted());
279 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), 0);
280
281 ASSERT_TRUE(timer_.Stop());
282 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), 0);
283 ASSERT_FALSE(timer_.HasStarted());
284 base::TimeDelta elapsed_time;
285 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
286 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
287 elapsed_time.InMilliseconds());
288}
289
290TEST_F(TimerTest, PauseResumeStop) {
291 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
292 .WillOnce(Return(stime))
293 .WillOnce(Return(stime2))
294 .WillOnce(Return(etime2));
295 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
296 ASSERT_TRUE(timer_.Pause());
297 ASSERT_TRUE(timer_.start_time_ == stime);
298 ASSERT_TRUE(timer_.HasStarted());
299
300 ASSERT_TRUE(timer_.Resume());
301 ASSERT_TRUE(timer_.HasStarted());
302
303 ASSERT_TRUE(timer_.Stop());
304 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta2MSec);
305 ASSERT_FALSE(timer_.HasStarted());
306 base::TimeDelta elapsed_time;
307 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
308 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
309 elapsed_time.InMilliseconds());
310}
311
312TEST_F(TimerTest, StartPauseResumePauseStop) {
313 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
314 .WillOnce(Return(stime))
315 .WillOnce(Return(etime))
316 .WillOnce(Return(stime2))
317 .WillOnce(Return(stime3))
318 .WillOnce(Return(etime3));
319 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
320 ASSERT_TRUE(timer_.Start());
321 ASSERT_TRUE(timer_.start_time_ == stime);
322 ASSERT_TRUE(timer_.HasStarted());
323
324 ASSERT_TRUE(timer_.Pause());
325 ASSERT_TRUE(timer_.HasStarted());
326 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
327 base::TimeDelta elapsed_time;
328 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
329 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
330 elapsed_time.InMilliseconds());
331
332 ASSERT_TRUE(timer_.Resume());
333 ASSERT_TRUE(timer_.HasStarted());
334 // Make sure GetElapsedTime works while we're running.
335 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
336 ASSERT_EQ(kDelta1MSec + kStime3MSec - kStime2MSec,
337 elapsed_time.InMilliseconds());
338
339 ASSERT_TRUE(timer_.Pause());
340 ASSERT_TRUE(timer_.HasStarted());
341 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
342 kDelta1MSec + kEtime3MSec - kStime2MSec);
343 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
344 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
345 elapsed_time.InMilliseconds());
346
347 ASSERT_TRUE(timer_.Stop());
348 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
349 kDelta1MSec + kEtime3MSec - kStime2MSec);
350 ASSERT_FALSE(timer_.HasStarted());
351 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
352 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
353 elapsed_time.InMilliseconds());
354}
355
356TEST_F(TimerTest, StartPauseResumePauseResumeStop) {
357 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
358 .WillOnce(Return(stime))
359 .WillOnce(Return(etime))
360 .WillOnce(Return(stime2))
361 .WillOnce(Return(etime2))
362 .WillOnce(Return(stime3))
363 .WillOnce(Return(etime3));
364 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
365 ASSERT_TRUE(timer_.Start());
366 ASSERT_TRUE(timer_.start_time_ == stime);
367 ASSERT_TRUE(timer_.HasStarted());
368
369 ASSERT_TRUE(timer_.Pause());
370 ASSERT_TRUE(timer_.HasStarted());
371 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec);
372 base::TimeDelta elapsed_time;
373 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
374 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
375 elapsed_time.InMilliseconds());
376
377 ASSERT_TRUE(timer_.Resume());
378 ASSERT_TRUE(timer_.HasStarted());
379
380 ASSERT_TRUE(timer_.Pause());
381 ASSERT_TRUE(timer_.HasStarted());
382 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), kDelta1MSec + kDelta2MSec);
383 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
384 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
385 elapsed_time.InMilliseconds());
386
387 ASSERT_TRUE(timer_.Resume());
388 ASSERT_TRUE(timer_.HasStarted());
389
390 ASSERT_TRUE(timer_.Stop());
391 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
392 kDelta1MSec + kDelta2MSec + kDelta3MSec);
393 ASSERT_FALSE(timer_.HasStarted());
394 ASSERT_TRUE(timer_.GetElapsedTime(&elapsed_time));
395 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(),
396 elapsed_time.InMilliseconds());
397}
398
Bruno Rochabe388f32011-08-02 12:40:17 -0700399static const char kMetricName[] = "test-timer";
400static const int kMinSample = 0;
401static const int kMaxSample = 120 * 1E6;
402static const int kNumBuckets = 50;
403
404class TimerReporterTest : public testing::Test {
405 public:
406 TimerReporterTest() : timer_reporter_(kMetricName, kMinSample, kMaxSample,
407 kNumBuckets),
408 clock_wrapper_mock_(new ClockWrapperMock()) {}
409
410 protected:
411 virtual void SetUp() {
412 timer_reporter_.set_metrics_lib(&lib_);
413 EXPECT_EQ(timer_reporter_.histogram_name_, kMetricName);
414 EXPECT_EQ(timer_reporter_.min_, kMinSample);
415 EXPECT_EQ(timer_reporter_.max_, kMaxSample);
416 EXPECT_EQ(timer_reporter_.num_buckets_, kNumBuckets);
repo sync06726552013-05-28 14:19:53 -0700417 stime += base::TimeDelta::FromMilliseconds(kStime1MSec);
418 etime += base::TimeDelta::FromMilliseconds(kEtime1MSec);
Bruno Rochabe388f32011-08-02 12:40:17 -0700419 }
420
421 virtual void TearDown() {
Alex Vakulenko14595032014-08-28 14:59:56 -0700422 timer_reporter_.set_metrics_lib(nullptr);
Bruno Rochabe388f32011-08-02 12:40:17 -0700423 }
424
425 TimerReporter timer_reporter_;
426 MetricsLibraryMock lib_;
427 scoped_ptr<ClockWrapperMock> clock_wrapper_mock_;
428 base::TimeTicks stime, etime;
429};
430
431TEST_F(TimerReporterTest, StartStopReport) {
432 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
433 .WillOnce(Return(stime))
434 .WillOnce(Return(etime));
435 timer_reporter_.clock_wrapper_.reset(clock_wrapper_mock_.release());
repo sync06726552013-05-28 14:19:53 -0700436 EXPECT_CALL(lib_, SendToUMA(kMetricName, kDelta1MSec, kMinSample, kMaxSample,
Bruno Rochabe388f32011-08-02 12:40:17 -0700437 kNumBuckets)).WillOnce(Return(true));
438 ASSERT_TRUE(timer_reporter_.Start());
439 ASSERT_TRUE(timer_reporter_.Stop());
440 ASSERT_TRUE(timer_reporter_.ReportMilliseconds());
441}
442
443TEST_F(TimerReporterTest, InvalidReport) {
444 ASSERT_FALSE(timer_reporter_.ReportMilliseconds());
445}
446
447} // namespace chromeos_metrics
448
449int main(int argc, char **argv) {
450 testing::InitGoogleTest(&argc, argv);
451 return RUN_ALL_TESTS();
452}