blob: 445aeeb0e870ede90cbf09e60f8460c29923dd99 [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
19class TimerTest : public testing::Test {
20 public:
21 TimerTest() : clock_wrapper_mock_(new ClockWrapperMock()) {}
22
23 protected:
24 virtual void SetUp() {
25 EXPECT_FALSE(timer_.is_started_);
26 stime += base::TimeDelta::FromMilliseconds(1500);
27 etime += base::TimeDelta::FromMilliseconds(3000);
28 }
29
30 virtual void TearDown() {}
31
32 Timer timer_;
33 scoped_ptr<ClockWrapperMock> clock_wrapper_mock_;
34 base::TimeTicks stime, etime;
35};
36
37TEST_F(TimerTest, StartStop) {
38 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
39 .WillOnce(Return(stime))
40 .WillOnce(Return(etime));
41 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
42 ASSERT_TRUE(timer_.Start());
43 ASSERT_TRUE(timer_.start_time_ == stime);
44 ASSERT_TRUE(timer_.HasStarted());
45 ASSERT_TRUE(timer_.Stop());
46 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), 1500);
47 ASSERT_FALSE(timer_.HasStarted());
48}
49
50TEST_F(TimerTest, ReStart) {
51 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
52 .WillOnce(Return(stime))
53 .WillOnce(Return(etime));
54 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
55 timer_.Start();
56 base::TimeTicks buffer = timer_.start_time_;
57 timer_.Start();
58 ASSERT_FALSE(timer_.start_time_ == buffer);
59}
60
61TEST_F(TimerTest, Reset) {
62 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
63 .WillOnce(Return(stime));
64 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
65 timer_.Start();
66 ASSERT_TRUE(timer_.Reset());
67 ASSERT_FALSE(timer_.HasStarted());
68}
69
70TEST_F(TimerTest, SeparatedTimers) {
71 base::TimeTicks stime2, etime2;
72 stime2 += base::TimeDelta::FromMilliseconds(4200);
73 etime2 += base::TimeDelta::FromMilliseconds(5000);
74 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
75 .WillOnce(Return(stime))
76 .WillOnce(Return(etime))
77 .WillOnce(Return(stime2))
78 .WillOnce(Return(etime2));
79 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
80 ASSERT_TRUE(timer_.Start());
81 ASSERT_TRUE(timer_.Stop());
82 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), 1500);
83 ASSERT_TRUE(timer_.Start());
84 ASSERT_TRUE(timer_.start_time_ == stime2);
85 ASSERT_TRUE(timer_.Stop());
86 ASSERT_EQ(timer_.elapsed_time_.InMilliseconds(), 800);
87 ASSERT_FALSE(timer_.HasStarted());
88}
89
90TEST_F(TimerTest, InvalidStop) {
91 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
92 .WillOnce(Return(stime))
93 .WillOnce(Return(etime));
94 timer_.clock_wrapper_.reset(clock_wrapper_mock_.release());
95 ASSERT_FALSE(timer_.Stop());
96 // Now we try it again, but after a valid start/stop.
97 timer_.Start();
98 timer_.Stop();
99 base::TimeDelta elapsed_time = timer_.elapsed_time_;
100 ASSERT_FALSE(timer_.Stop());
101 ASSERT_TRUE(elapsed_time == timer_.elapsed_time_);
102}
103
104TEST_F(TimerTest, InvalidElapsedTime) {
105 base::TimeDelta elapsed_time;
106 ASSERT_FALSE(timer_.GetElapsedTime(&elapsed_time));
107}
108
109static const char kMetricName[] = "test-timer";
110static const int kMinSample = 0;
111static const int kMaxSample = 120 * 1E6;
112static const int kNumBuckets = 50;
113
114class TimerReporterTest : public testing::Test {
115 public:
116 TimerReporterTest() : timer_reporter_(kMetricName, kMinSample, kMaxSample,
117 kNumBuckets),
118 clock_wrapper_mock_(new ClockWrapperMock()) {}
119
120 protected:
121 virtual void SetUp() {
122 timer_reporter_.set_metrics_lib(&lib_);
123 EXPECT_EQ(timer_reporter_.histogram_name_, kMetricName);
124 EXPECT_EQ(timer_reporter_.min_, kMinSample);
125 EXPECT_EQ(timer_reporter_.max_, kMaxSample);
126 EXPECT_EQ(timer_reporter_.num_buckets_, kNumBuckets);
127 stime += base::TimeDelta::FromMilliseconds(1500);
128 etime += base::TimeDelta::FromMilliseconds(3000);
129 }
130
131 virtual void TearDown() {
132 timer_reporter_.set_metrics_lib(NULL);
133 }
134
135 TimerReporter timer_reporter_;
136 MetricsLibraryMock lib_;
137 scoped_ptr<ClockWrapperMock> clock_wrapper_mock_;
138 base::TimeTicks stime, etime;
139};
140
141TEST_F(TimerReporterTest, StartStopReport) {
142 EXPECT_CALL(*clock_wrapper_mock_, GetCurrentTime())
143 .WillOnce(Return(stime))
144 .WillOnce(Return(etime));
145 timer_reporter_.clock_wrapper_.reset(clock_wrapper_mock_.release());
146 EXPECT_CALL(lib_, SendToUMA(kMetricName, 1500, kMinSample, kMaxSample,
147 kNumBuckets)).WillOnce(Return(true));
148 ASSERT_TRUE(timer_reporter_.Start());
149 ASSERT_TRUE(timer_reporter_.Stop());
150 ASSERT_TRUE(timer_reporter_.ReportMilliseconds());
151}
152
153TEST_F(TimerReporterTest, InvalidReport) {
154 ASSERT_FALSE(timer_reporter_.ReportMilliseconds());
155}
156
157} // namespace chromeos_metrics
158
159int main(int argc, char **argv) {
160 testing::InitGoogleTest(&argc, argv);
161 return RUN_ALL_TESTS();
162}