1 // Copyright 2020 The Chromium Authors
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/date_changed_helper.h"
6
7 #include "base/time/time.h"
8 #include "base/time/time_override.h"
9 #include "components/prefs/testing_pref_service.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace metrics {
13
14 namespace {
15
16 using base::subtle::TimeNowIgnoringOverride;
17
18 const char kTestPrefName[] = "TestPref";
19
20 // TODO(crbug.com/40099277): Use TaskEnvironment::TimeSource::MOCK_TIME here
21 // instead of explicit clock overrides when it better supports setting a
22 // specific time of day and rewinding time.
23 class DateChangedHelperTest : public testing::Test {
24 public:
SetUp()25 void SetUp() override {
26 date_changed_helper::RegisterPref(prefs_.registry(), kTestPrefName);
27 }
28
29 protected:
30 TestingPrefServiceSimple prefs_;
31 };
32
33 } // namespace
34
35 // Should not consider date changed if the preference is not available.
TEST_F(DateChangedHelperTest,TestNewDoesNotFire)36 TEST_F(DateChangedHelperTest, TestNewDoesNotFire) {
37 SCOPED_TRACE(base::Time::Now());
38 ASSERT_FALSE(
39 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName));
40 }
41
42 // Should consider date changed if the preference is more than a day old.
TEST_F(DateChangedHelperTest,TestOldFires)43 TEST_F(DateChangedHelperTest, TestOldFires) {
44 SCOPED_TRACE(base::Time::Now());
45 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName);
46
47 base::subtle::ScopedTimeClockOverrides time_override(
48 []() { return TimeNowIgnoringOverride() + base::Hours(25); }, nullptr,
49 nullptr);
50 ASSERT_TRUE(
51 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName));
52 }
53
54 // Should consider date changed if the preference is more than a day in the
55 // future.
TEST_F(DateChangedHelperTest,TestFutureFires)56 TEST_F(DateChangedHelperTest, TestFutureFires) {
57 SCOPED_TRACE(base::Time::Now());
58 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName);
59
60 base::subtle::ScopedTimeClockOverrides time_override(
61 []() { return TimeNowIgnoringOverride() - base::Hours(25); }, nullptr,
62 nullptr);
63 ASSERT_TRUE(
64 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName));
65 }
66
67 // Should not consider date changed if the preference is earlier the same day.
TEST_F(DateChangedHelperTest,TestEarlierSameDayNotFired)68 TEST_F(DateChangedHelperTest, TestEarlierSameDayNotFired) {
69 SCOPED_TRACE(base::Time::Now());
70 {
71 base::subtle::ScopedTimeClockOverrides time_override(
72 []() {
73 return TimeNowIgnoringOverride().LocalMidnight() + base::Hours(2);
74 },
75 nullptr, nullptr);
76 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName);
77 }
78
79 base::subtle::ScopedTimeClockOverrides time_override(
80 []() {
81 return TimeNowIgnoringOverride().LocalMidnight() + base::Hours(22);
82 },
83 nullptr, nullptr);
84 ASSERT_FALSE(
85 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName));
86 }
87
88 // Should not consider date changed if the preference is later the same day.
TEST_F(DateChangedHelperTest,TestLaterSameDayNotFired)89 TEST_F(DateChangedHelperTest, TestLaterSameDayNotFired) {
90 SCOPED_TRACE(base::Time::Now());
91 {
92 base::subtle::ScopedTimeClockOverrides time_override(
93 []() {
94 return TimeNowIgnoringOverride().LocalMidnight() + base::Hours(22);
95 },
96 nullptr, nullptr);
97 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName);
98 }
99
100 base::subtle::ScopedTimeClockOverrides time_override(
101 []() {
102 return TimeNowIgnoringOverride().LocalMidnight() + base::Hours(2);
103 },
104 nullptr, nullptr);
105 ASSERT_FALSE(
106 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName));
107 }
108
109 // Should consider date changed if the preference is in the previous day.
TEST_F(DateChangedHelperTest,TestJustNextDayFired)110 TEST_F(DateChangedHelperTest, TestJustNextDayFired) {
111 SCOPED_TRACE(base::Time::Now());
112 {
113 base::subtle::ScopedTimeClockOverrides time_override(
114 []() {
115 return TimeNowIgnoringOverride().LocalMidnight() - base::Minutes(5);
116 },
117 nullptr, nullptr);
118 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName);
119 }
120
121 base::subtle::ScopedTimeClockOverrides time_override(
122 []() {
123 return TimeNowIgnoringOverride().LocalMidnight() + base::Minutes(5);
124 },
125 nullptr, nullptr);
126 ASSERT_TRUE(
127 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName));
128 }
129
130 // Should consider date changed if the preference is in the next day.
TEST_F(DateChangedHelperTest,TestJustPreviousDayFired)131 TEST_F(DateChangedHelperTest, TestJustPreviousDayFired) {
132 SCOPED_TRACE(base::Time::Now());
133 {
134 base::subtle::ScopedTimeClockOverrides time_override(
135 []() {
136 return TimeNowIgnoringOverride().LocalMidnight() + base::Minutes(5);
137 },
138 nullptr, nullptr);
139 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName);
140 }
141
142 base::subtle::ScopedTimeClockOverrides time_override(
143 []() {
144 return TimeNowIgnoringOverride().LocalMidnight() - base::Minutes(5);
145 },
146 nullptr, nullptr);
147 ASSERT_TRUE(
148 date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName));
149 }
150
151 } // namespace metrics
152