1// Copyright 2014 The Chromium 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 "components/metrics/daily_event.h"
6
7#include "base/prefs/testing_pref_service.h"
8#include "testing/gtest/include/gtest/gtest.h"
9
10namespace metrics {
11
12namespace {
13
14const char kTestPrefName[] = "TestPref";
15const char kTestMetricName[] = "TestMetric";
16
17class TestDailyObserver : public DailyEvent::Observer {
18 public:
19  TestDailyObserver() : fired_(false) {}
20
21  bool fired() const { return fired_; }
22
23  virtual void OnDailyEvent() OVERRIDE {
24    fired_ = true;
25  }
26
27  void Reset() {
28    fired_ = false;
29  }
30
31 private:
32  // True if this event has been observed.
33  bool fired_;
34
35  DISALLOW_COPY_AND_ASSIGN(TestDailyObserver);
36};
37
38class DailyEventTest : public testing::Test {
39 public:
40  DailyEventTest() : event_(&prefs_, kTestPrefName, kTestMetricName) {
41    DailyEvent::RegisterPref(prefs_.registry(), kTestPrefName);
42    observer_ = new TestDailyObserver();
43    scoped_ptr<metrics::DailyEvent::Observer> p(observer_);
44    event_.AddObserver(p.Pass());
45  }
46
47 protected:
48  TestingPrefServiceSimple prefs_;
49  TestDailyObserver* observer_;
50  DailyEvent event_;
51
52 private:
53  DISALLOW_COPY_AND_ASSIGN(DailyEventTest);
54};
55
56}  // namespace
57
58// The event should fire if the preference is not available.
59TEST_F(DailyEventTest, TestNewFires) {
60  event_.CheckInterval();
61  EXPECT_TRUE(observer_->fired());
62}
63
64// The event should fire if the preference is more than a day old.
65TEST_F(DailyEventTest, TestOldFires) {
66  base::Time last_time = base::Time::Now() - base::TimeDelta::FromHours(25);
67  prefs_.SetInt64(kTestPrefName, last_time.ToInternalValue());
68  event_.CheckInterval();
69  EXPECT_TRUE(observer_->fired());
70}
71
72// The event should fire if the preference is more than a day in the future.
73TEST_F(DailyEventTest, TestFutureFires) {
74  base::Time last_time = base::Time::Now() + base::TimeDelta::FromHours(25);
75  prefs_.SetInt64(kTestPrefName, last_time.ToInternalValue());
76  event_.CheckInterval();
77  EXPECT_TRUE(observer_->fired());
78}
79
80// The event should not fire if the preference is more recent than a day.
81TEST_F(DailyEventTest, TestRecentNotFired) {
82  base::Time last_time = base::Time::Now() - base::TimeDelta::FromMinutes(2);
83  prefs_.SetInt64(kTestPrefName, last_time.ToInternalValue());
84  event_.CheckInterval();
85  EXPECT_FALSE(observer_->fired());
86}
87
88// The event should not fire if the preference is less than a day in the future.
89TEST_F(DailyEventTest, TestSoonNotFired) {
90  base::Time last_time = base::Time::Now() + base::TimeDelta::FromMinutes(2);
91  prefs_.SetInt64(kTestPrefName, last_time.ToInternalValue());
92  event_.CheckInterval();
93  EXPECT_FALSE(observer_->fired());
94}
95
96}  // namespace metrics
97