| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/metrics/date_changed_helper.h" |
| |
| #include "base/time/time.h" |
| #include "base/time/time_override.h" |
| #include "components/prefs/testing_pref_service.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace metrics { |
| |
| namespace { |
| |
| using base::subtle::TimeNowIgnoringOverride; |
| |
| const char kTestPrefName[] = "TestPref"; |
| |
| // TODO(crbug.com/1004987): Use TaskEnvironment::TimeSource::MOCK_TIME here |
| // instead of explicit clock overrides when it better supports setting a |
| // specific time of day and rewinding time. |
| class DateChangedHelperTest : public testing::Test { |
| public: |
| void SetUp() override { |
| date_changed_helper::RegisterPref(prefs_.registry(), kTestPrefName); |
| } |
| |
| protected: |
| TestingPrefServiceSimple prefs_; |
| }; |
| |
| } // namespace |
| |
| // Should not consider date changed if the preference is not available. |
| TEST_F(DateChangedHelperTest, TestNewDoesNotFire) { |
| SCOPED_TRACE(base::Time::Now()); |
| ASSERT_FALSE( |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName)); |
| } |
| |
| // Should consider date changed if the preference is more than a day old. |
| TEST_F(DateChangedHelperTest, TestOldFires) { |
| SCOPED_TRACE(base::Time::Now()); |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName); |
| |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { return TimeNowIgnoringOverride() + base::Hours(25); }, nullptr, |
| nullptr); |
| ASSERT_TRUE( |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName)); |
| } |
| |
| // Should consider date changed if the preference is more than a day in the |
| // future. |
| TEST_F(DateChangedHelperTest, TestFutureFires) { |
| SCOPED_TRACE(base::Time::Now()); |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName); |
| |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { return TimeNowIgnoringOverride() - base::Hours(25); }, nullptr, |
| nullptr); |
| ASSERT_TRUE( |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName)); |
| } |
| |
| // Should not consider date changed if the preference is earlier the same day. |
| TEST_F(DateChangedHelperTest, TestEarlierSameDayNotFired) { |
| SCOPED_TRACE(base::Time::Now()); |
| { |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { |
| return TimeNowIgnoringOverride().LocalMidnight() + base::Hours(2); |
| }, |
| nullptr, nullptr); |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName); |
| } |
| |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { |
| return TimeNowIgnoringOverride().LocalMidnight() + base::Hours(22); |
| }, |
| nullptr, nullptr); |
| ASSERT_FALSE( |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName)); |
| } |
| |
| // Should not consider date changed if the preference is later the same day. |
| TEST_F(DateChangedHelperTest, TestLaterSameDayNotFired) { |
| SCOPED_TRACE(base::Time::Now()); |
| { |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { |
| return TimeNowIgnoringOverride().LocalMidnight() + base::Hours(22); |
| }, |
| nullptr, nullptr); |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName); |
| } |
| |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { |
| return TimeNowIgnoringOverride().LocalMidnight() + base::Hours(2); |
| }, |
| nullptr, nullptr); |
| ASSERT_FALSE( |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName)); |
| } |
| |
| // Should consider date changed if the preference is in the previous day. |
| TEST_F(DateChangedHelperTest, TestJustNextDayFired) { |
| SCOPED_TRACE(base::Time::Now()); |
| { |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { |
| return TimeNowIgnoringOverride().LocalMidnight() - base::Minutes(5); |
| }, |
| nullptr, nullptr); |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName); |
| } |
| |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { |
| return TimeNowIgnoringOverride().LocalMidnight() + base::Minutes(5); |
| }, |
| nullptr, nullptr); |
| ASSERT_TRUE( |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName)); |
| } |
| |
| // Should consider date changed if the preference is in the next day. |
| TEST_F(DateChangedHelperTest, TestJustPreviousDayFired) { |
| SCOPED_TRACE(base::Time::Now()); |
| { |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { |
| return TimeNowIgnoringOverride().LocalMidnight() + base::Minutes(5); |
| }, |
| nullptr, nullptr); |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName); |
| } |
| |
| base::subtle::ScopedTimeClockOverrides time_override( |
| []() { |
| return TimeNowIgnoringOverride().LocalMidnight() - base::Minutes(5); |
| }, |
| nullptr, nullptr); |
| ASSERT_TRUE( |
| date_changed_helper::HasDateChangedSinceLastCall(&prefs_, kTestPrefName)); |
| } |
| |
| } // namespace metrics |