blob: 86832f03b823eacc081d87c7870b1a15818e9e7d [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2020 The Chromium Authors
Adam Norbergc7ab1c52021-01-19 21:05:212// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "testing/gtest/include/gtest/gtest.h"
6
Adam Norbergc7ab1c52021-01-19 21:05:217#include <string>
8#include <vector>
9
10#include "base/files/file_path.h"
Joshua Pawlicki34aacc12021-08-24 21:22:2111#include "base/memory/scoped_refptr.h"
S. Ganesh5b7c6a72022-05-21 01:20:5612#include "base/values.h"
Noah Rose Ledesma38b7be12022-09-26 19:15:3413#include "build/build_config.h"
Adam Norbergc7ab1c52021-01-19 21:05:2114#include "chrome/updater/constants.h"
15#include "chrome/updater/external_constants.h"
16#include "chrome/updater/external_constants_builder.h"
Joshua Pawlicki58a597ed2021-06-10 17:00:5217#include "chrome/updater/external_constants_default.h"
Adam Norbergc7ab1c52021-01-19 21:05:2118#include "chrome/updater/external_constants_override.h"
Sorin Jianu86d1ef62022-10-06 22:16:0219#include "chrome/updater/test_scope.h"
20#include "chrome/updater/unittest_util.h"
Adam Norbergc7ab1c52021-01-19 21:05:2121#include "chrome/updater/updater_branding.h"
Noah Rose Ledesmafc9b3652022-11-12 02:10:4922#include "chrome/updater/util/util.h"
Anton Bikineev46bbb972021-05-15 17:53:5323#include "third_party/abseil-cpp/absl/types/optional.h"
Adam Norbergc7ab1c52021-01-19 21:05:2124#include "url/gurl.h"
25
26namespace updater {
Adam Norbergc7ab1c52021-01-19 21:05:2127
28class ExternalConstantsBuilderTests : public ::testing::Test {
29 protected:
Sorin Jianu86d1ef62022-10-06 22:16:0230 void SetUp() override {
31 EXPECT_TRUE(
32 test::DeleteFileAndEmptyParentDirectories(overrides_file_path_));
33 }
34 void TearDown() override {
35 EXPECT_TRUE(
36 test::DeleteFileAndEmptyParentDirectories(overrides_file_path_));
37 }
38
39 private:
40 // This test runs non-elevated.
41 const absl::optional<base::FilePath> overrides_file_path_ =
42 test::GetOverrideFilePath(UpdaterScope::kUser);
Adam Norbergc7ab1c52021-01-19 21:05:2143};
44
Adam Norbergc7ab1c52021-01-19 21:05:2145TEST_F(ExternalConstantsBuilderTests, TestOverridingNothing) {
46 EXPECT_TRUE(ExternalConstantsBuilder().Overwrite());
47
Joshua Pawlicki34aacc12021-08-24 21:22:2148 scoped_refptr<ExternalConstantsOverrider> verifier =
Adam Norbergc7ab1c52021-01-19 21:05:2149 ExternalConstantsOverrider::FromDefaultJSONFile(
Joshua Pawlicki58a597ed2021-06-10 17:00:5250 CreateDefaultExternalConstants());
Adam Norbergc7ab1c52021-01-19 21:05:2151
52 EXPECT_TRUE(verifier->UseCUP());
53
54 std::vector<GURL> urls = verifier->UpdateURL();
55 ASSERT_EQ(urls.size(), 1ul);
56 EXPECT_EQ(urls[0], GURL(UPDATE_CHECK_URL));
57
58 EXPECT_EQ(verifier->InitialDelay(), kInitialDelay);
Mila Green59389f12021-02-03 20:52:3259 EXPECT_EQ(verifier->ServerKeepAliveSeconds(), kServerKeepAliveSeconds);
S. Ganesh5b7c6a72022-05-21 01:20:5660 EXPECT_EQ(verifier->GroupPolicies().size(), 0U);
Adam Norbergc7ab1c52021-01-19 21:05:2161}
62
63TEST_F(ExternalConstantsBuilderTests, TestOverridingEverything) {
Matt Menkeb1732aac2022-06-02 13:48:0364 base::Value::Dict group_policies;
65 group_policies.Set("a", 1);
66 group_policies.Set("b", 2);
S. Ganesh5b7c6a72022-05-21 01:20:5667
Adam Norbergc7ab1c52021-01-19 21:05:2168 ExternalConstantsBuilder builder;
69 builder.SetUpdateURL(std::vector<std::string>{"https://www.example.com"})
70 .SetUseCUP(false)
Mila Green59389f12021-02-03 20:52:3271 .SetInitialDelay(123)
S. Ganesh5b7c6a72022-05-21 01:20:5672 .SetServerKeepAliveSeconds(2)
73 .SetGroupPolicies(group_policies);
Adam Norbergc7ab1c52021-01-19 21:05:2174 EXPECT_TRUE(builder.Overwrite());
75
Joshua Pawlicki34aacc12021-08-24 21:22:2176 scoped_refptr<ExternalConstantsOverrider> verifier =
Adam Norbergc7ab1c52021-01-19 21:05:2177 ExternalConstantsOverrider::FromDefaultJSONFile(
Joshua Pawlicki58a597ed2021-06-10 17:00:5278 CreateDefaultExternalConstants());
Adam Norbergc7ab1c52021-01-19 21:05:2179
80 EXPECT_FALSE(verifier->UseCUP());
81
82 std::vector<GURL> urls = verifier->UpdateURL();
83 ASSERT_EQ(urls.size(), 1ul);
84 EXPECT_EQ(urls[0], GURL("https://www.example.com"));
85
86 EXPECT_EQ(verifier->InitialDelay(), 123);
Mila Green59389f12021-02-03 20:52:3287 EXPECT_EQ(verifier->ServerKeepAliveSeconds(), 2);
S. Ganesh5b7c6a72022-05-21 01:20:5688 EXPECT_EQ(verifier->GroupPolicies().size(), 2U);
Adam Norbergc7ab1c52021-01-19 21:05:2189}
90
91TEST_F(ExternalConstantsBuilderTests, TestPartialOverrideWithMultipleURLs) {
92 ExternalConstantsBuilder builder;
93 EXPECT_TRUE(builder
94 .SetUpdateURL(std::vector<std::string>{
95 "https://www.google.com", "https://www.example.com"})
96 .Overwrite());
97
Joshua Pawlicki34aacc12021-08-24 21:22:2198 scoped_refptr<ExternalConstantsOverrider> verifier =
Adam Norbergc7ab1c52021-01-19 21:05:2199 ExternalConstantsOverrider::FromDefaultJSONFile(
Joshua Pawlicki58a597ed2021-06-10 17:00:52100 CreateDefaultExternalConstants());
Adam Norbergc7ab1c52021-01-19 21:05:21101
102 EXPECT_TRUE(verifier->UseCUP());
103
104 std::vector<GURL> urls = verifier->UpdateURL();
105 ASSERT_EQ(urls.size(), 2ul);
106 EXPECT_EQ(urls[0], GURL("https://www.google.com"));
107 EXPECT_EQ(urls[1], GURL("https://www.example.com"));
108
109 EXPECT_EQ(verifier->InitialDelay(), kInitialDelay);
Mila Green59389f12021-02-03 20:52:32110 EXPECT_EQ(verifier->ServerKeepAliveSeconds(), kServerKeepAliveSeconds);
S. Ganesh5b7c6a72022-05-21 01:20:56111 EXPECT_EQ(verifier->GroupPolicies().size(), 0U);
Adam Norbergc7ab1c52021-01-19 21:05:21112}
113
114TEST_F(ExternalConstantsBuilderTests, TestClearedEverything) {
115 ExternalConstantsBuilder builder;
116 EXPECT_TRUE(builder
117 .SetUpdateURL(std::vector<std::string>{
118 "https://www.google.com", "https://www.example.com"})
119 .SetUseCUP(false)
Mila Green1cb26962021-01-21 01:00:00120 .SetInitialDelay(123.4)
Adam Norbergc7ab1c52021-01-19 21:05:21121 .ClearUpdateURL()
122 .ClearUseCUP()
123 .ClearInitialDelay()
Mila Green59389f12021-02-03 20:52:32124 .ClearServerKeepAliveSeconds()
S. Ganesh5b7c6a72022-05-21 01:20:56125 .ClearGroupPolicies()
Adam Norbergc7ab1c52021-01-19 21:05:21126 .Overwrite());
127
Joshua Pawlicki34aacc12021-08-24 21:22:21128 scoped_refptr<ExternalConstantsOverrider> verifier =
Adam Norbergc7ab1c52021-01-19 21:05:21129 ExternalConstantsOverrider::FromDefaultJSONFile(
Joshua Pawlicki58a597ed2021-06-10 17:00:52130 CreateDefaultExternalConstants());
Adam Norbergc7ab1c52021-01-19 21:05:21131 EXPECT_TRUE(verifier->UseCUP());
132
133 std::vector<GURL> urls = verifier->UpdateURL();
134 ASSERT_EQ(urls.size(), 1ul);
135 EXPECT_EQ(urls[0], GURL(UPDATE_CHECK_URL));
136
137 EXPECT_EQ(verifier->InitialDelay(), kInitialDelay);
Mila Green59389f12021-02-03 20:52:32138 EXPECT_EQ(verifier->ServerKeepAliveSeconds(), kServerKeepAliveSeconds);
S. Ganesh5b7c6a72022-05-21 01:20:56139 EXPECT_EQ(verifier->GroupPolicies().size(), 0U);
Adam Norbergc7ab1c52021-01-19 21:05:21140}
141
142TEST_F(ExternalConstantsBuilderTests, TestOverSet) {
Matt Menkeb1732aac2022-06-02 13:48:03143 base::Value::Dict group_policies;
144 group_policies.Set("a", 1);
S. Ganesh5b7c6a72022-05-21 01:20:56145
Adam Norbergc7ab1c52021-01-19 21:05:21146 EXPECT_TRUE(
147 ExternalConstantsBuilder()
148 .SetUpdateURL(std::vector<std::string>{"https://www.google.com"})
149 .SetUseCUP(true)
Mila Green1cb26962021-01-21 01:00:00150 .SetInitialDelay(123.4)
Mila Green59389f12021-02-03 20:52:32151 .SetServerKeepAliveSeconds(2)
S. Ganesh5b7c6a72022-05-21 01:20:56152 .SetGroupPolicies(group_policies)
Adam Norbergc7ab1c52021-01-19 21:05:21153 .SetUpdateURL(std::vector<std::string>{"https://www.example.com"})
154 .SetUseCUP(false)
Mila Green1cb26962021-01-21 01:00:00155 .SetInitialDelay(937.6)
Mila Green59389f12021-02-03 20:52:32156 .SetServerKeepAliveSeconds(3)
Adam Norbergc7ab1c52021-01-19 21:05:21157 .Overwrite());
158
159 // Only the second set of values should be observed.
Joshua Pawlicki34aacc12021-08-24 21:22:21160 scoped_refptr<ExternalConstantsOverrider> verifier =
Adam Norbergc7ab1c52021-01-19 21:05:21161 ExternalConstantsOverrider::FromDefaultJSONFile(
Joshua Pawlicki58a597ed2021-06-10 17:00:52162 CreateDefaultExternalConstants());
Adam Norbergc7ab1c52021-01-19 21:05:21163 EXPECT_FALSE(verifier->UseCUP());
164
165 std::vector<GURL> urls = verifier->UpdateURL();
166 ASSERT_EQ(urls.size(), 1ul);
167 EXPECT_EQ(urls[0], GURL("https://www.example.com"));
168
Mila Green1cb26962021-01-21 01:00:00169 EXPECT_EQ(verifier->InitialDelay(), 937.6);
Mila Green59389f12021-02-03 20:52:32170 EXPECT_EQ(verifier->ServerKeepAliveSeconds(), 3);
S. Ganesh5b7c6a72022-05-21 01:20:56171 EXPECT_EQ(verifier->GroupPolicies().size(), 1U);
Adam Norbergc7ab1c52021-01-19 21:05:21172}
173
174TEST_F(ExternalConstantsBuilderTests, TestReuseBuilder) {
175 ExternalConstantsBuilder builder;
S. Ganesh5b7c6a72022-05-21 01:20:56176
Matt Menkeb1732aac2022-06-02 13:48:03177 base::Value::Dict group_policies;
178 group_policies.Set("a", 1);
179 group_policies.Set("b", 2);
S. Ganesh5b7c6a72022-05-21 01:20:56180
Adam Norbergc7ab1c52021-01-19 21:05:21181 EXPECT_TRUE(
182 builder.SetUpdateURL(std::vector<std::string>{"https://www.google.com"})
183 .SetUseCUP(false)
Mila Green1cb26962021-01-21 01:00:00184 .SetInitialDelay(123.4)
Mila Green59389f12021-02-03 20:52:32185 .SetServerKeepAliveSeconds(3)
Adam Norbergc7ab1c52021-01-19 21:05:21186 .SetUpdateURL(std::vector<std::string>{"https://www.example.com"})
S. Ganesh5b7c6a72022-05-21 01:20:56187 .SetGroupPolicies(group_policies)
Adam Norbergc7ab1c52021-01-19 21:05:21188 .Overwrite());
189
Joshua Pawlicki34aacc12021-08-24 21:22:21190 scoped_refptr<ExternalConstantsOverrider> verifier =
Adam Norbergc7ab1c52021-01-19 21:05:21191 ExternalConstantsOverrider::FromDefaultJSONFile(
Joshua Pawlicki58a597ed2021-06-10 17:00:52192 CreateDefaultExternalConstants());
Adam Norbergc7ab1c52021-01-19 21:05:21193
194 EXPECT_FALSE(verifier->UseCUP());
195
196 std::vector<GURL> urls = verifier->UpdateURL();
197 ASSERT_EQ(urls.size(), 1ul);
198 EXPECT_EQ(urls[0], GURL("https://www.example.com"));
199
Mila Green1cb26962021-01-21 01:00:00200 EXPECT_EQ(verifier->InitialDelay(), 123.4);
Mila Green59389f12021-02-03 20:52:32201 EXPECT_EQ(verifier->ServerKeepAliveSeconds(), 3);
S. Ganesh5b7c6a72022-05-21 01:20:56202 EXPECT_EQ(verifier->GroupPolicies().size(), 2U);
203
Matt Menkeb1732aac2022-06-02 13:48:03204 base::Value::Dict group_policies2;
205 group_policies2.Set("b", 2);
Adam Norbergc7ab1c52021-01-19 21:05:21206
207 // But now we can use the builder again:
Mila Green59389f12021-02-03 20:52:32208 EXPECT_TRUE(builder.SetInitialDelay(92.3)
209 .SetServerKeepAliveSeconds(4)
210 .ClearUpdateURL()
S. Ganesh5b7c6a72022-05-21 01:20:56211 .SetGroupPolicies(group_policies2)
Mila Green59389f12021-02-03 20:52:32212 .Overwrite());
Adam Norbergc7ab1c52021-01-19 21:05:21213
214 // We need a new overrider to verify because it only loads once.
Joshua Pawlicki34aacc12021-08-24 21:22:21215 scoped_refptr<ExternalConstantsOverrider> verifier2 =
Adam Norbergc7ab1c52021-01-19 21:05:21216 ExternalConstantsOverrider::FromDefaultJSONFile(
Joshua Pawlicki58a597ed2021-06-10 17:00:52217 CreateDefaultExternalConstants());
Adam Norbergc7ab1c52021-01-19 21:05:21218
219 EXPECT_FALSE(verifier2->UseCUP()); // Not updated, value should be retained.
220
221 std::vector<GURL> urls2 = verifier2->UpdateURL();
222 ASSERT_EQ(urls2.size(), 1ul);
223 EXPECT_EQ(urls2[0], GURL(UPDATE_CHECK_URL)); // Cleared; should be default.
224
Mila Green1cb26962021-01-21 01:00:00225 EXPECT_EQ(verifier2->InitialDelay(),
226 92.3); // Updated; update should be seen.
Mila Green59389f12021-02-03 20:52:32227 EXPECT_EQ(verifier2->ServerKeepAliveSeconds(), 4);
S. Ganesh5b7c6a72022-05-21 01:20:56228 EXPECT_EQ(verifier2->GroupPolicies().size(), 1U);
229}
230
231TEST_F(ExternalConstantsBuilderTests, TestModify) {
232 ExternalConstantsBuilder builder;
233
Matt Menkeb1732aac2022-06-02 13:48:03234 base::Value::Dict group_policies;
235 group_policies.Set("a", 1);
236 group_policies.Set("b", 2);
S. Ganesh5b7c6a72022-05-21 01:20:56237
238 EXPECT_TRUE(
239 builder.SetUpdateURL(std::vector<std::string>{"https://www.google.com"})
240 .SetUseCUP(false)
241 .SetInitialDelay(123.4)
242 .SetServerKeepAliveSeconds(3)
243 .SetUpdateURL(std::vector<std::string>{"https://www.example.com"})
244 .SetGroupPolicies(group_policies)
245 .Overwrite());
246
247 scoped_refptr<ExternalConstantsOverrider> verifier =
248 ExternalConstantsOverrider::FromDefaultJSONFile(
249 CreateDefaultExternalConstants());
250
251 EXPECT_FALSE(verifier->UseCUP());
252
253 std::vector<GURL> urls = verifier->UpdateURL();
254 ASSERT_EQ(urls.size(), 1ul);
255 EXPECT_EQ(urls[0], GURL("https://www.example.com"));
256
257 EXPECT_EQ(verifier->InitialDelay(), 123.4);
258 EXPECT_EQ(verifier->ServerKeepAliveSeconds(), 3);
259 EXPECT_EQ(verifier->GroupPolicies().size(), 2U);
260
261 // Now we use a new builder to modify just the group policies.
262 ExternalConstantsBuilder builder2;
263
Matt Menkeb1732aac2022-06-02 13:48:03264 base::Value::Dict group_policies2;
265 group_policies2.Set("b", 2);
S. Ganesh5b7c6a72022-05-21 01:20:56266
267 EXPECT_TRUE(builder2.SetGroupPolicies(group_policies2).Modify());
268
269 // We need a new overrider to verify because it only loads once.
270 scoped_refptr<ExternalConstantsOverrider> verifier2 =
271 ExternalConstantsOverrider::FromDefaultJSONFile(
272 CreateDefaultExternalConstants());
273
274 // Only the group policies are different.
275 EXPECT_EQ(verifier2->GroupPolicies().size(), 1U);
276
277 // All the values below are unchanged.
278 EXPECT_FALSE(verifier2->UseCUP());
279 urls = verifier2->UpdateURL();
280 ASSERT_EQ(urls.size(), 1ul);
281 EXPECT_EQ(urls[0], GURL("https://www.example.com"));
282 EXPECT_EQ(verifier2->InitialDelay(), 123.4);
283 EXPECT_EQ(verifier2->ServerKeepAliveSeconds(), 3);
Adam Norbergc7ab1c52021-01-19 21:05:21284}
Adam Norbergc7ab1c52021-01-19 21:05:21285
286} // namespace updater