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