1 // Copyright 2019 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/offline_pages/core/prefetch/prefetch_prefs.h"
6 #include "base/test/scoped_feature_list.h"
7 #include "components/offline_pages/buildflags/buildflags.h"
8 #include "components/offline_pages/core/offline_clock.h"
9 #include "components/offline_pages/core/offline_page_feature.h"
10 #include "components/offline_pages/core/test_scoped_offline_clock.h"
11 #include "components/prefs/testing_pref_service.h"
12 #include "components/version_info/version_info.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 namespace offline_pages {
16 
17 class PrefetchPrefsTest : public testing::Test {
18  public:
19   void SetUp() override;
20 
prefs()21   TestingPrefServiceSimple* prefs() { return &pref_service_; }
22 
23  private:
24   TestingPrefServiceSimple pref_service_;
25 };
26 
SetUp()27 void PrefetchPrefsTest::SetUp() {
28   prefetch_prefs::RegisterPrefs(prefs()->registry());
29 }
30 
TEST_F(PrefetchPrefsTest,PrefetchingEnabled)31 TEST_F(PrefetchPrefsTest, PrefetchingEnabled) {
32   base::test::ScopedFeatureList feature_list;
33   feature_list.InitAndEnableFeature(kPrefetchingOfflinePagesFeature);
34   EXPECT_FALSE(prefetch_prefs::IsEnabled(prefs()));
35   prefetch_prefs::SetEnabledByServer(prefs(), true);
36   EXPECT_TRUE(prefetch_prefs::IsEnabled(prefs()));
37 
38   prefetch_prefs::SetPrefetchingEnabledInSettings(prefs(), false);
39   EXPECT_FALSE(prefetch_prefs::IsEnabled(prefs()));
40 
41   base::test::ScopedFeatureList disabled_feature_list;
42   disabled_feature_list.InitAndDisableFeature(kPrefetchingOfflinePagesFeature);
43   // If disabled by default, should remain disabled.
44   prefetch_prefs::SetPrefetchingEnabledInSettings(prefs(), true);
45   EXPECT_FALSE(prefetch_prefs::IsEnabled(prefs()));
46 }
47 
TEST_F(PrefetchPrefsTest,LimitlessPrefetchingEnabled)48 TEST_F(PrefetchPrefsTest, LimitlessPrefetchingEnabled) {
49   // Check that the default value is false.
50   EXPECT_FALSE(prefetch_prefs::IsLimitlessPrefetchingEnabled(prefs()));
51 
52   // Check that limitless can be enabled.
53   prefetch_prefs::SetLimitlessPrefetchingEnabled(prefs(), true);
54   EXPECT_TRUE(prefetch_prefs::IsLimitlessPrefetchingEnabled(prefs()));
55 
56   // Check that it can be disabled.
57   prefetch_prefs::SetLimitlessPrefetchingEnabled(prefs(), false);
58   EXPECT_FALSE(prefetch_prefs::IsLimitlessPrefetchingEnabled(prefs()));
59 
60   // Simulate time passing to check that the setting turns itself off as
61   // expected.
62   base::TimeDelta enabled_duration;
63   if (version_info::IsOfficialBuild())
64     enabled_duration = base::TimeDelta::FromDays(1);
65   else
66     enabled_duration = base::TimeDelta::FromDays(365);
67 
68   base::TimeDelta advance_delta = base::TimeDelta::FromHours(2);
69   base::Time now = OfflineTimeNow();
70 
71   prefetch_prefs::SetLimitlessPrefetchingEnabled(prefs(), true);
72   TestScopedOfflineClock test_clock;
73 
74   // Set time to just before the setting expires:
75   test_clock.SetNow(now + enabled_duration - advance_delta);
76   EXPECT_TRUE(prefetch_prefs::IsLimitlessPrefetchingEnabled(prefs()));
77 
78   // Advance to just after it expires:
79   test_clock.Advance(2 * advance_delta);
80   EXPECT_FALSE(prefetch_prefs::IsLimitlessPrefetchingEnabled(prefs()));
81 }
82 
TEST_F(PrefetchPrefsTest,TestingHeaderValuePref)83 TEST_F(PrefetchPrefsTest, TestingHeaderValuePref) {
84   // Should be empty string by default.
85   EXPECT_EQ(std::string(), prefetch_prefs::GetPrefetchTestingHeader(prefs()));
86 
87   prefetch_prefs::SetPrefetchTestingHeader(prefs(), "ForceEnable");
88   EXPECT_EQ("ForceEnable", prefetch_prefs::GetPrefetchTestingHeader(prefs()));
89 
90   prefetch_prefs::SetPrefetchTestingHeader(prefs(), "ForceDisable");
91   EXPECT_EQ("ForceDisable", prefetch_prefs::GetPrefetchTestingHeader(prefs()));
92 
93   // We're not doing any checking/changing of the value (the server does that).
94   prefetch_prefs::SetPrefetchTestingHeader(prefs(), "asdfasdfasdf");
95   EXPECT_EQ("asdfasdfasdf", prefetch_prefs::GetPrefetchTestingHeader(prefs()));
96 }
97 
TEST_F(PrefetchPrefsTest,EnabledByServer)98 TEST_F(PrefetchPrefsTest, EnabledByServer) {
99   EXPECT_FALSE(prefetch_prefs::IsEnabledByServer(prefs()));
100 
101   prefetch_prefs::SetEnabledByServer(prefs(), true);
102   EXPECT_TRUE(prefetch_prefs::IsEnabledByServer(prefs()));
103 
104   prefetch_prefs::SetEnabledByServer(prefs(), false);
105   EXPECT_FALSE(prefetch_prefs::IsEnabledByServer(prefs()));
106 }
107 
TEST_F(PrefetchPrefsTest,ForbiddenCheck)108 TEST_F(PrefetchPrefsTest, ForbiddenCheck) {
109   base::test::ScopedFeatureList feature_list;
110   feature_list.InitAndEnableFeature(kPrefetchingOfflinePagesFeature);
111 
112   // Check should be due in seven days.
113   prefetch_prefs::SetEnabledByServer(prefs(), false);
114   EXPECT_FALSE(prefetch_prefs::IsForbiddenCheckDue(prefs()));
115 
116   TestScopedOfflineClock test_clock;
117   base::Time later = OfflineTimeNow() + base::TimeDelta::FromDays(8);
118   test_clock.SetNow(later);
119 
120   prefetch_prefs::SetPrefetchingEnabledInSettings(prefs(), false);
121   EXPECT_FALSE(prefetch_prefs::IsForbiddenCheckDue(prefs()));
122   prefetch_prefs::SetPrefetchingEnabledInSettings(prefs(), true);
123   EXPECT_TRUE(prefetch_prefs::IsForbiddenCheckDue(prefs()));
124 
125   // The check is not due if we are server-enabled.
126   prefetch_prefs::SetEnabledByServer(prefs(), true);
127   EXPECT_FALSE(prefetch_prefs::IsForbiddenCheckDue(prefs()));
128 
129   // Simulate the feature being disabled.
130   test_clock.SetNow(OfflineTimeNow());
131   prefetch_prefs::SetEnabledByServer(prefs(), false);
132 
133   base::test::ScopedFeatureList disabled_feature_list;
134   disabled_feature_list.InitAndDisableFeature(kPrefetchingOfflinePagesFeature);
135   test_clock.SetNow(later);
136   EXPECT_FALSE(prefetch_prefs::IsForbiddenCheckDue(prefs()));
137 }
138 
TEST_F(PrefetchPrefsTest,FirstForbiddenCheck)139 TEST_F(PrefetchPrefsTest, FirstForbiddenCheck) {
140   base::test::ScopedFeatureList feature_list;
141   feature_list.InitAndEnableFeature(kPrefetchingOfflinePagesFeature);
142 
143   EXPECT_TRUE(prefetch_prefs::IsForbiddenCheckDue(prefs()));
144   EXPECT_TRUE(prefetch_prefs::IsEnabledByServerUnknown(prefs()));
145 
146   // Pretend a check was performed and failed.
147   prefetch_prefs::SetEnabledByServer(prefs(), false);
148 
149   // Jump ahead in time so that a check should be due.
150   TestScopedOfflineClock test_clock;
151   test_clock.SetNow(OfflineTimeNow() + base::TimeDelta::FromDays(8));
152 
153   EXPECT_TRUE(prefetch_prefs::IsForbiddenCheckDue(prefs()));
154   EXPECT_FALSE(prefetch_prefs::IsEnabledByServerUnknown(prefs()));
155 }
156 
157 }  // namespace offline_pages
158