xref: /aosp_15_r20/external/cronet/components/metrics/daily_event_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/daily_event.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <optional>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
11*6777b538SAndroid Build Coastguard Worker #include "components/prefs/testing_pref_service.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker namespace metrics {
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace {
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker const char kTestPrefName[] = "TestPref";
19*6777b538SAndroid Build Coastguard Worker const char kTestMetricName[] = "TestMetric";
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker class TestDailyObserver : public DailyEvent::Observer {
22*6777b538SAndroid Build Coastguard Worker  public:
23*6777b538SAndroid Build Coastguard Worker   TestDailyObserver() = default;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker   TestDailyObserver(const TestDailyObserver&) = delete;
26*6777b538SAndroid Build Coastguard Worker   TestDailyObserver& operator=(const TestDailyObserver&) = delete;
27*6777b538SAndroid Build Coastguard Worker 
fired() const28*6777b538SAndroid Build Coastguard Worker   bool fired() const { return type_.has_value(); }
type() const29*6777b538SAndroid Build Coastguard Worker   DailyEvent::IntervalType type() const { return type_.value(); }
30*6777b538SAndroid Build Coastguard Worker 
OnDailyEvent(DailyEvent::IntervalType type)31*6777b538SAndroid Build Coastguard Worker   void OnDailyEvent(DailyEvent::IntervalType type) override { type_ = type; }
32*6777b538SAndroid Build Coastguard Worker 
Reset()33*6777b538SAndroid Build Coastguard Worker   void Reset() { type_ = {}; }
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker  private:
36*6777b538SAndroid Build Coastguard Worker   // Last-received type, or unset if OnDailyEvent() hasn't been called.
37*6777b538SAndroid Build Coastguard Worker   std::optional<DailyEvent::IntervalType> type_;
38*6777b538SAndroid Build Coastguard Worker };
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker class DailyEventTest : public testing::Test {
41*6777b538SAndroid Build Coastguard Worker  public:
DailyEventTest()42*6777b538SAndroid Build Coastguard Worker   DailyEventTest() : event_(&prefs_, kTestPrefName, kTestMetricName) {
43*6777b538SAndroid Build Coastguard Worker     DailyEvent::RegisterPref(prefs_.registry(), kTestPrefName);
44*6777b538SAndroid Build Coastguard Worker     auto observer = std::make_unique<TestDailyObserver>();
45*6777b538SAndroid Build Coastguard Worker     observer_ = observer.get();
46*6777b538SAndroid Build Coastguard Worker     event_.AddObserver(std::move(observer));
47*6777b538SAndroid Build Coastguard Worker   }
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker   DailyEventTest(const DailyEventTest&) = delete;
50*6777b538SAndroid Build Coastguard Worker   DailyEventTest& operator=(const DailyEventTest&) = delete;
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker  protected:
53*6777b538SAndroid Build Coastguard Worker   TestingPrefServiceSimple prefs_;
54*6777b538SAndroid Build Coastguard Worker   DailyEvent event_;  // Owns and outlives `observer_`
55*6777b538SAndroid Build Coastguard Worker   raw_ptr<TestDailyObserver> observer_;
56*6777b538SAndroid Build Coastguard Worker };
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker }  // namespace
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker // The event should fire if the preference is not available.
TEST_F(DailyEventTest,TestNewFires)61*6777b538SAndroid Build Coastguard Worker TEST_F(DailyEventTest, TestNewFires) {
62*6777b538SAndroid Build Coastguard Worker   event_.CheckInterval();
63*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(observer_->fired());
64*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(DailyEvent::IntervalType::FIRST_RUN, observer_->type());
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker // The event should fire if the preference is more than a day old.
TEST_F(DailyEventTest,TestOldFires)68*6777b538SAndroid Build Coastguard Worker TEST_F(DailyEventTest, TestOldFires) {
69*6777b538SAndroid Build Coastguard Worker   base::Time last_time = base::Time::Now() - base::Hours(25);
70*6777b538SAndroid Build Coastguard Worker   prefs_.SetInt64(kTestPrefName, last_time.since_origin().InMicroseconds());
71*6777b538SAndroid Build Coastguard Worker   event_.CheckInterval();
72*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(observer_->fired());
73*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(DailyEvent::IntervalType::DAY_ELAPSED, observer_->type());
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker // The event should fire if the preference is more than a day in the future.
TEST_F(DailyEventTest,TestFutureFires)77*6777b538SAndroid Build Coastguard Worker TEST_F(DailyEventTest, TestFutureFires) {
78*6777b538SAndroid Build Coastguard Worker   base::Time last_time = base::Time::Now() + base::Hours(25);
79*6777b538SAndroid Build Coastguard Worker   prefs_.SetInt64(kTestPrefName, last_time.since_origin().InMicroseconds());
80*6777b538SAndroid Build Coastguard Worker   event_.CheckInterval();
81*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(observer_->fired());
82*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(DailyEvent::IntervalType::CLOCK_CHANGED, observer_->type());
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker // The event should not fire if the preference is more recent than a day.
TEST_F(DailyEventTest,TestRecentNotFired)86*6777b538SAndroid Build Coastguard Worker TEST_F(DailyEventTest, TestRecentNotFired) {
87*6777b538SAndroid Build Coastguard Worker   base::Time last_time = base::Time::Now() - base::Minutes(2);
88*6777b538SAndroid Build Coastguard Worker   prefs_.SetInt64(kTestPrefName, last_time.since_origin().InMicroseconds());
89*6777b538SAndroid Build Coastguard Worker   event_.CheckInterval();
90*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(observer_->fired());
91*6777b538SAndroid Build Coastguard Worker }
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker // The event should not fire if the preference is less than a day in the future.
TEST_F(DailyEventTest,TestSoonNotFired)94*6777b538SAndroid Build Coastguard Worker TEST_F(DailyEventTest, TestSoonNotFired) {
95*6777b538SAndroid Build Coastguard Worker   base::Time last_time = base::Time::Now() + base::Minutes(2);
96*6777b538SAndroid Build Coastguard Worker   prefs_.SetInt64(kTestPrefName, last_time.since_origin().InMicroseconds());
97*6777b538SAndroid Build Coastguard Worker   event_.CheckInterval();
98*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(observer_->fired());
99*6777b538SAndroid Build Coastguard Worker }
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
102