blob: 90c3cd8ce27371fa0f0798ae19638838eaad2d46 [file] [log] [blame]
Darin Petkovf1e85e42010-06-10 15:59:53 -07001// Copyright (c) 2010 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 <sys/file.h>
6
Darin Petkovf1e85e42010-06-10 15:59:53 -07007#include <base/file_util.h>
8#include <base/logging.h>
Chris Masonee10b5482013-02-14 12:15:35 -08009#include <base/posix/eintr_wrapper.h>
Ben Chan2e6543d2014-02-05 23:26:25 -080010#include <base/strings/string_util.h>
Darin Petkovf1e85e42010-06-10 15:59:53 -070011#include <gmock/gmock.h>
12#include <gtest/gtest.h>
13
14#include "counter.h"
Ken Mixterccd84c02010-08-16 19:57:13 -070015#include "counter_mock.h" // For TaggedCounterMock.
Ken Mixter4c5daa42010-08-26 18:35:06 -070016#include "metrics_library_mock.h"
Darin Petkovf1e85e42010-06-10 15:59:53 -070017
Ben Chan2e6543d2014-02-05 23:26:25 -080018using base::FilePath;
Darin Petkovf1e85e42010-06-10 15:59:53 -070019using ::testing::_;
20using ::testing::MockFunction;
21using ::testing::StrictMock;
22
23namespace chromeos_metrics {
24
25static const char kTestRecordFile[] = "record-file";
26static const char kDoesNotExistFile[] = "/does/not/exist";
27
28class RecordTest : public testing::Test {
29 protected:
30 virtual void SetUp() {
Luigi Semenzato859b3f02014-02-05 15:33:19 -080031 EXPECT_EQ(0, record_.report_tag());
32 EXPECT_EQ(0, record_.reset_tag());
Darin Petkovf1e85e42010-06-10 15:59:53 -070033 EXPECT_EQ(0, record_.count());
34 }
35
36 // The record under test.
37 TaggedCounter::Record record_;
38};
39
40class TaggedCounterTest : public testing::Test {
41 protected:
42 virtual void SetUp() {
Ken Mixter4c5daa42010-08-26 18:35:06 -070043 EXPECT_TRUE(counter_.filename_.empty());
Darin Petkovf1e85e42010-06-10 15:59:53 -070044 EXPECT_TRUE(NULL == counter_.reporter_);
45 EXPECT_EQ(NULL, counter_.reporter_handle_);
46 EXPECT_EQ(TaggedCounter::kRecordInvalid, counter_.record_state_);
47
48 counter_.Init(kTestRecordFile, &Reporter, this);
49 EXPECT_TRUE(AssertNoOrEmptyRecordFile());
50 EXPECT_EQ(kTestRecordFile, counter_.filename_);
51 EXPECT_TRUE(Reporter == counter_.reporter_);
52 EXPECT_EQ(this, counter_.reporter_handle_);
53 EXPECT_EQ(TaggedCounter::kRecordInvalid, counter_.record_state_);
54
55 // The test fixture object will be used by the log message handler.
56 test_ = this;
57 logging::SetLogMessageHandler(HandleLogMessages);
58 }
59
60 virtual void TearDown() {
61 logging::SetLogMessageHandler(NULL);
62 test_ = NULL;
Ben Chan2e6543d2014-02-05 23:26:25 -080063 base::DeleteFile(FilePath(kTestRecordFile), false);
Darin Petkovf1e85e42010-06-10 15:59:53 -070064 }
65
Luigi Semenzato859b3f02014-02-05 15:33:19 -080066 testing::AssertionResult AssertRecord(const char* expr_reset_tag,
Darin Petkovf1e85e42010-06-10 15:59:53 -070067 const char* expr_count,
Luigi Semenzato859b3f02014-02-05 15:33:19 -080068 uint32 expected_reset_tag,
Darin Petkovcd8c3172010-06-24 10:13:54 -070069 int32 expected_count) {
Luigi Semenzato859b3f02014-02-05 15:33:19 -080070 return AssertRecordFull(12345, expected_reset_tag, expected_count, false);
71 }
72
73 // Asserts that the record file contains the specified contents.
74 testing::AssertionResult AssertRecord3(const char* expr_report_tag,
75 const char* expr_reset_tag,
76 const char* expr_count,
77 uint32 expected_report_tag,
78 uint32 expected_reset_tag,
79 int32 expected_count) {
80 return AssertRecordFull(expected_report_tag, expected_reset_tag,
81 expected_count, true);
82 }
83
84 testing::AssertionResult AssertRecordFull(uint32 expected_report_tag,
85 uint32 expected_reset_tag,
86 int32 expected_count,
87 bool check_report_tag) {
Darin Petkovf1e85e42010-06-10 15:59:53 -070088 int fd = HANDLE_EINTR(open(kTestRecordFile, O_RDONLY));
89 if (fd < 0) {
90 testing::Message msg;
91 msg << "Unable to open " << kTestRecordFile;
92 return testing::AssertionFailure(msg);
93 }
94
95 TaggedCounter::Record record;
Ben Chan2e6543d2014-02-05 23:26:25 -080096 if (!base::ReadFromFD(fd, reinterpret_cast<char*>(&record),
97 sizeof(record))) {
Darin Petkovf1e85e42010-06-10 15:59:53 -070098 testing::Message msg;
99 msg << "Unable to read " << sizeof(record) << " bytes from "
100 << kTestRecordFile;
101 HANDLE_EINTR(close(fd));
102 return testing::AssertionFailure(msg);
103 }
104
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800105 if ((check_report_tag && (record.report_tag() != expected_report_tag)) ||
106 record.reset_tag() != expected_reset_tag ||
107 record.count() != expected_count) {
Darin Petkovf1e85e42010-06-10 15:59:53 -0700108 testing::Message msg;
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800109 msg << "actual record (" << record.report_tag() << ", "
110 << record.reset_tag() << ", " << record.count()
111 << ") expected (" << expected_report_tag << ", "
112 << expected_reset_tag << ", " << expected_count << ")";
113 if (!check_report_tag)
114 msg << "\n(ignore differences in the first field)";
Darin Petkovf1e85e42010-06-10 15:59:53 -0700115 HANDLE_EINTR(close(fd));
116 return testing::AssertionFailure(msg);
117 }
118
119 HANDLE_EINTR(close(fd));
120 return testing::AssertionSuccess();
121 }
122
123 // Returns true if the persistent record file does not exist or is
124 // empty, false otherwise.
125 bool AssertNoOrEmptyRecordFile() {
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800126 base::FilePath record_file(counter_.filename_);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700127 int64 record_file_size;
Ben Chan2e6543d2014-02-05 23:26:25 -0800128 return !base::PathExists(record_file) ||
129 (base::GetFileSize(record_file, &record_file_size) &&
130 record_file_size == 0);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700131 }
132
133 // Adds a reporter call expectation that the specified tag/count
134 // callback will be generated.
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800135 void ExpectReporterCall(int32 count) {
136 EXPECT_CALL(reporter_, Call(_, count))
Darin Petkovf1e85e42010-06-10 15:59:53 -0700137 .Times(1)
138 .RetiresOnSaturation();
139 }
140
141 // The reporter callback forwards the call to the reporter mock so
142 // that we can set call expectations.
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800143 static void Reporter(void* handle, int32 count) {
Darin Petkovf1e85e42010-06-10 15:59:53 -0700144 TaggedCounterTest* test = static_cast<TaggedCounterTest*>(handle);
145 ASSERT_FALSE(NULL == test);
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800146 test->reporter_.Call(handle, count);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700147 }
148
149 // Collects log messages in the |log_| member string so that they
150 // can be analyzed for errors and expected behavior.
Chris Masone817016a2011-05-12 14:14:48 -0700151 static bool HandleLogMessages(int severity,
152 const char* file,
153 int line,
154 size_t message_start,
155 const std::string& str) {
Darin Petkovf1e85e42010-06-10 15:59:53 -0700156 test_->log_.append(str);
157 test_->log_.append("\n");
158
159 // Returning true would mute the log.
160 return false;
161 }
162
163 // Returns true if the counter log contains |pattern|, false otherwise.
Darin Petkovcd8c3172010-06-24 10:13:54 -0700164 bool LogContains(const std::string& pattern) const {
Darin Petkovf1e85e42010-06-10 15:59:53 -0700165 return log_.find(pattern) != std::string::npos;
166 }
167
168 // The TaggedCounter object under test.
169 TaggedCounter counter_;
170
171 // The accumulated counter log.
172 std::string log_;
173
174 // Reporter mock to set callback expectations on.
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800175 StrictMock<MockFunction<void(void* handle, int32 count)> > reporter_;
Darin Petkovf1e85e42010-06-10 15:59:53 -0700176
177 // Pointer to the current test fixture.
178 static TaggedCounterTest* test_;
179};
180
181// static
182TaggedCounterTest* TaggedCounterTest::test_ = NULL;
183
184TEST_F(RecordTest, Init) {
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800185 record_.Init(/* report_tag */ 8, /* reset_tag */ 5, /* count */ -1);
186 EXPECT_EQ(8, record_.report_tag());
187 EXPECT_EQ(5, record_.reset_tag());
Darin Petkovf1e85e42010-06-10 15:59:53 -0700188 EXPECT_EQ(0, record_.count());
189
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800190 record_.Init(/* report_tag */ -8, /* reset_tag */ -2, /* count */ 10);
191 EXPECT_EQ(-8, record_.report_tag());
192 EXPECT_EQ(-2, record_.reset_tag());
Darin Petkovf1e85e42010-06-10 15:59:53 -0700193 EXPECT_EQ(10, record_.count());
194}
195
196TEST_F(RecordTest, Add) {
197 record_.Add(/* count */ -1);
198 EXPECT_EQ(0, record_.count());
199
200 record_.Add(/* count */ 5);
201 EXPECT_EQ(5, record_.count());
202
203 record_.Add(/* count */ 10);
204 EXPECT_EQ(15, record_.count());
205
206 record_.Add(/* count */ -2);
207 EXPECT_EQ(15, record_.count());
208
Darin Petkovcd8c3172010-06-24 10:13:54 -0700209 record_.Add(/* count */ kint32max);
210 EXPECT_EQ(kint32max, record_.count());
Darin Petkovf1e85e42010-06-10 15:59:53 -0700211
212 record_.Add(/* count */ 1);
Darin Petkovcd8c3172010-06-24 10:13:54 -0700213 EXPECT_EQ(kint32max, record_.count());
Darin Petkovf1e85e42010-06-10 15:59:53 -0700214}
215
216TEST_F(TaggedCounterTest, BadFileLocation) {
217 // Checks that the counter doesn't die badly if the file can't be
218 // created.
219 counter_.Init(kDoesNotExistFile,
220 /* reporter */ NULL, /* reporter_handle */ NULL);
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800221 counter_.Update(/* report_tag */ 0, /* reset_tag */ 10, /* count */ 20);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700222 EXPECT_TRUE(LogContains("Unable to open the persistent counter file: "
223 "No such file or directory"));
224 EXPECT_EQ(TaggedCounter::kRecordInvalid, counter_.record_state_);
Ben Chan2e6543d2014-02-05 23:26:25 -0800225 base::DeleteFile(FilePath(kDoesNotExistFile), false);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700226}
227
228TEST_F(TaggedCounterTest, Flush) {
229 counter_.Flush();
230 EXPECT_EQ(TaggedCounter::kRecordNull, counter_.record_state_);
231
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800232 counter_.Update(/* report_tag */ 0, /* reset_tag */ 40, /* count */ 60);
233 ExpectReporterCall(/* count */ 60);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700234 counter_.Flush();
235 EXPECT_TRUE(AssertNoOrEmptyRecordFile());
236 EXPECT_EQ(TaggedCounter::kRecordNull, counter_.record_state_);
237
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800238 counter_.Update(/* report_tag */ 0, /* reset_tag */ 41, /* count */ 70);
239 counter_.record_.Init(/* report_tag */ 0, /* reset_tag */ 0, /* count */ 0);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700240 counter_.record_state_ = TaggedCounter::kRecordInvalid;
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800241 ExpectReporterCall(/* count */ 70);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700242 counter_.Flush();
243 EXPECT_TRUE(AssertNoOrEmptyRecordFile());
244 EXPECT_EQ(TaggedCounter::kRecordNull, counter_.record_state_);
245}
246
247TEST_F(TaggedCounterTest, InitFromFile) {
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800248 counter_.Update(/* report_tag */ 0, /* reset_tag */ 30, /* count */ 50);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700249 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 30, /* seconds */ 50);
250 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
251
252 counter_.Init(kTestRecordFile, &Reporter, this);
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800253 counter_.Update(/* report_tag */ 0, /* reset_tag */ 30, /* count */ 40);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700254 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 30, /* seconds */ 90);
255 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
256
257 counter_.Init(kTestRecordFile, &Reporter, this);
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800258 ExpectReporterCall(/* count */ 90);
259 counter_.Update(/* report_tag */ 0, /* reset_tag */ 31, /* count */ 60);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700260 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 31, /* seconds */ 60);
261 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
262
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800263 ExpectReporterCall(/* count */ 60);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700264 counter_.Init(kTestRecordFile, &Reporter, this);
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800265 counter_.Update(/* report_tag */ 0, /* reset_tag */ 32, /* count */ 0);
Darin Petkov1bb904e2010-06-16 15:58:06 -0700266 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 32, /* seconds */ 0);
267 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700268}
269
270TEST_F(TaggedCounterTest, Update) {
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800271 counter_.Update(/* report_tag */ 0, /* reset_tag */ 20, /* count */ 30);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700272 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 20, /* seconds */ 30);
273 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
274
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800275 counter_.Update(/* report_tag */ 0, /* reset_tag */ 20, /* count */ 40);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700276 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 20, /* seconds */ 70);
277 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
278
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800279 ExpectReporterCall(/* count */ 70);
280 counter_.Update(/* report_tag */ 0, /* reset_tag */ 21, /* count */ 15);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700281 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 21, /* seconds */ 15);
282 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
283
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800284 ExpectReporterCall(/* count */ 15);
285 counter_.Update(/* report_tag */ 0, /* reset_tag */ 22, /* count */ 0);
Darin Petkov1bb904e2010-06-16 15:58:06 -0700286 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 22, /* seconds */ 0);
287 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800288
289 ExpectReporterCall(/* count */ 33);
290 counter_.Update(/* report_tag */ 0, /* reset_tag */ 22, /* count */ 33);
291 EXPECT_PRED_FORMAT2(AssertRecord, /* day */ 22, /* seconds */ 33);
292 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
293 // Check that changing the report tag does not reset the counter.
294 counter_.Update(/* report_tag */ 1, /* reset_tag */ 22, /* count */ 0);
295 EXPECT_PRED_FORMAT3(AssertRecord3, /* version */ 1,
296 /* day */ 22, /* seconds */ 33);
297 EXPECT_EQ(TaggedCounter::kRecordValid, counter_.record_state_);
Darin Petkovf1e85e42010-06-10 15:59:53 -0700298}
299
Ken Mixter4c5daa42010-08-26 18:35:06 -0700300static const char kTestFilename[] = "test_filename";
301static const char kTestHistogram[] = "test_histogram";
302const int kHistogramMin = 15;
303const int kHistogramMax = 1024;
304const int kHistogramBuckets = 23;
305
306class TaggedCounterReporterTest : public testing::Test {
307 protected:
308 virtual void SetUp() {
309 tagged_counter_ = new StrictMock<TaggedCounterMock>();
310 reporter_.tagged_counter_.reset(tagged_counter_);
311 metrics_lib_.reset(new StrictMock<MetricsLibraryMock>);
312 reporter_.SetMetricsLibraryInterface(metrics_lib_.get());
313 ASSERT_TRUE(metrics_lib_.get() == reporter_.metrics_lib_);
314 }
315 virtual void TearDown() {
316 reporter_.SetMetricsLibraryInterface(NULL);
317 }
318
319 void DoInit();
320 StrictMock<TaggedCounterMock>* tagged_counter_;
321 TaggedCounterReporter reporter_;
322 scoped_ptr<MetricsLibraryMock> metrics_lib_;
323};
324
325void TaggedCounterReporterTest::DoInit() {
326 EXPECT_CALL(*tagged_counter_,
327 Init(kTestFilename,
328 TaggedCounterReporter::Report,
329 &reporter_))
330 .Times(1)
331 .RetiresOnSaturation();
332 reporter_.Init(kTestFilename,
333 kTestHistogram,
334 kHistogramMin,
335 kHistogramMax,
336 kHistogramBuckets);
337 EXPECT_EQ(kTestHistogram, reporter_.histogram_name_);
338 EXPECT_EQ(kHistogramBuckets, reporter_.buckets_);
339 EXPECT_EQ(kHistogramMax, reporter_.max_);
340 EXPECT_EQ(kHistogramMin, reporter_.min_);
341}
342
343TEST_F(TaggedCounterReporterTest, Init) {
344 DoInit();
345}
346
347TEST_F(TaggedCounterReporterTest, Update) {
348 DoInit();
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800349 EXPECT_CALL(*tagged_counter_, Update(1, 0, 2))
Ken Mixter4c5daa42010-08-26 18:35:06 -0700350 .Times(1)
351 .RetiresOnSaturation();
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800352 reporter_.Update(1, 0, 2);
Ken Mixter4c5daa42010-08-26 18:35:06 -0700353}
354
355TEST_F(TaggedCounterReporterTest, Flush) {
356 DoInit();
357 EXPECT_CALL(*tagged_counter_, Flush())
358 .Times(1)
359 .RetiresOnSaturation();
360 reporter_.Flush();
361}
362
363TEST_F(TaggedCounterReporterTest, Report) {
364 DoInit();
365 EXPECT_CALL(*metrics_lib_, SendToUMA(kTestHistogram,
366 301,
367 kHistogramMin,
368 kHistogramMax,
369 kHistogramBuckets))
370 .Times(1)
371 .RetiresOnSaturation();
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800372 reporter_.Report(&reporter_, 301);
Ken Mixter4c5daa42010-08-26 18:35:06 -0700373}
374
Ken Mixterccd84c02010-08-16 19:57:13 -0700375class FrequencyCounterTest : public testing::Test {
376 protected:
377 virtual void SetUp() {
Ken Mixter4c5daa42010-08-26 18:35:06 -0700378 tagged_counter_ = NULL;
Ken Mixterccd84c02010-08-16 19:57:13 -0700379 }
380
381 void CheckInit(int32 cycle_duration);
382 void CheckCycleNumber(int32 cycle_duration);
383
384 FrequencyCounter frequency_counter_;
385 StrictMock<TaggedCounterMock>* tagged_counter_;
386
387 TaggedCounter::Reporter reporter_;
388};
389
390void FrequencyCounterTest::CheckInit(int32 cycle_duration) {
Ken Mixter4c5daa42010-08-26 18:35:06 -0700391 tagged_counter_ = new StrictMock<TaggedCounterMock>;
392 frequency_counter_.Init(tagged_counter_, cycle_duration);
Ken Mixterccd84c02010-08-16 19:57:13 -0700393 EXPECT_EQ(cycle_duration, frequency_counter_.cycle_duration_);
Ken Mixter4c5daa42010-08-26 18:35:06 -0700394 EXPECT_EQ(tagged_counter_, frequency_counter_.tagged_counter_.get());
Ken Mixterccd84c02010-08-16 19:57:13 -0700395}
396
397TEST_F(FrequencyCounterTest, Init) {
398 CheckInit(100);
399}
400
401void FrequencyCounterTest::CheckCycleNumber(int32 cycle_duration) {
402 CheckInit(cycle_duration);
Ken Mixter4c5daa42010-08-26 18:35:06 -0700403 EXPECT_EQ(150, frequency_counter_.GetCycleNumber(
404 cycle_duration * 150));
405 EXPECT_EQ(150, frequency_counter_.GetCycleNumber(
406 cycle_duration * 150 + cycle_duration - 1));
407 EXPECT_EQ(151, frequency_counter_.GetCycleNumber(
408 cycle_duration * 151 + 1));
Ken Mixterccd84c02010-08-16 19:57:13 -0700409 EXPECT_EQ(0, frequency_counter_.GetCycleNumber(0));
410}
411
412
413TEST_F(FrequencyCounterTest, GetCycleNumberForWeek) {
414 CheckCycleNumber(kSecondsPerWeek);
415}
416
417TEST_F(FrequencyCounterTest, GetCycleNumberForDay) {
418 CheckCycleNumber(kSecondsPerDay);
419}
420
421TEST_F(FrequencyCounterTest, UpdateInternal) {
422 CheckInit(kSecondsPerWeek);
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800423 EXPECT_CALL(*tagged_counter_, Update(0, 150, 2))
Ken Mixter4c5daa42010-08-26 18:35:06 -0700424 .Times(1)
425 .RetiresOnSaturation();
Ken Mixterccd84c02010-08-16 19:57:13 -0700426 frequency_counter_.UpdateInternal(2, kSecondsPerWeek * 150);
427}
428
Luigi Semenzato859b3f02014-02-05 15:33:19 -0800429class VersionCounterTest : public testing::Test {
430 protected:
431 virtual void SetUp() {
432 tagged_counter_ = NULL;
433 }
434 void Init();
435
436 VersionCounter version_counter_;
437 StrictMock<TaggedCounterMock>* tagged_counter_;
438
439 TaggedCounter::Reporter reporter_;
440};
441
442void VersionCounterTest::Init() {
443 tagged_counter_ = new StrictMock<TaggedCounterMock>;
444 version_counter_.Init(tagged_counter_, 1);
445 EXPECT_EQ(tagged_counter_, version_counter_.tagged_counter_.get());
446}
447
448TEST_F(VersionCounterTest, UpdateInternal) {
449 Init();
450 EXPECT_CALL(*tagged_counter_, Update(0, 150, 2))
451 .Times(1)
452 .RetiresOnSaturation();
453 version_counter_.UpdateInternal(2, 0, 150);
454}
455
Darin Petkovf1e85e42010-06-10 15:59:53 -0700456} // namespace chromeos_metrics
457
458int main(int argc, char** argv) {
459 testing::InitGoogleTest(&argc, argv);
460 return RUN_ALL_TESTS();
461}