1 // Copyright (c) 2012 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.
6 #include <shlwapi.h> // For SHDeleteKey.
8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "base/test/test_reg_util_win.h"
11 #include "base/win/registry.h"
12 #include "chrome/common/chrome_constants.h"
13 #include "chrome/installer/util/browser_distribution.h"
14 #include "chrome/installer/util/channel_info.h"
15 #include "chrome/installer/util/fake_installation_state.h"
16 #include "chrome/installer/util/google_update_constants.h"
17 #include "chrome/installer/util/google_update_experiment_util.h"
18 #include "chrome/installer/util/google_update_settings.h"
19 #include "chrome/installer/util/util_constants.h"
20 #include "chrome/installer/util/work_item_list.h"
21 #include "testing/gtest/include/gtest/gtest.h"
23 using base::win::RegKey
;
24 using installer::ChannelInfo
;
28 const wchar_t kGoogleUpdatePoliciesKey
[] =
29 L
"SOFTWARE\\Policies\\Google\\Update";
30 const wchar_t kGoogleUpdateUpdateDefault
[] = L
"UpdateDefault";
31 const wchar_t kGoogleUpdateUpdatePrefix
[] = L
"Update";
32 const GoogleUpdateSettings::UpdatePolicy kDefaultUpdatePolicy
=
33 #if defined(GOOGLE_CHROME_BUILD)
34 GoogleUpdateSettings::AUTOMATIC_UPDATES
;
36 GoogleUpdateSettings::UPDATES_DISABLED
;
39 const wchar_t kTestProductGuid
[] = L
"{89F1B351-B15D-48D4-8F10-1298721CF13D}";
40 const wchar_t kTestExperimentLabel
[] = L
"test_label_value";
42 // This test fixture redirects the HKLM and HKCU registry hives for
43 // the duration of the test to make it independent of the machine
45 class GoogleUpdateSettingsTest
: public testing::Test
{
47 virtual void SetUp() OVERRIDE
{
48 registry_overrides_
.OverrideRegistry(HKEY_LOCAL_MACHINE
, L
"HKLM_pit");
49 registry_overrides_
.OverrideRegistry(HKEY_CURRENT_USER
, L
"HKCU_pit");
52 enum SystemUserInstall
{
57 void SetApField(SystemUserInstall is_system
, const wchar_t* value
) {
58 HKEY root
= is_system
== SYSTEM_INSTALL
?
59 HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
;
62 BrowserDistribution
* dist
= BrowserDistribution::GetDistribution();
63 std::wstring path
= dist
->GetStateKey();
64 ASSERT_EQ(ERROR_SUCCESS
, update_key
.Create(root
, path
.c_str(), KEY_WRITE
));
65 ASSERT_EQ(ERROR_SUCCESS
, update_key
.WriteValue(L
"ap", value
));
68 // Tests setting the ap= value to various combinations of values with
69 // prefixes and suffixes, while asserting on the correct channel value.
70 // Note that any non-empty ap= value that doesn't match ".*-{dev|beta}.*"
71 // will return the "unknown" channel.
72 void TestCurrentChromeChannelWithVariousApValues(SystemUserInstall install
) {
73 static struct Expectations
{
74 const wchar_t* ap_value
;
75 const wchar_t* channel
;
77 { L
"dev", installer::kChromeChannelDev
},
78 { L
"-dev", installer::kChromeChannelDev
},
79 { L
"-developer", installer::kChromeChannelDev
},
80 { L
"beta", installer::kChromeChannelBeta
},
81 { L
"-beta", installer::kChromeChannelBeta
},
82 { L
"-betamax", installer::kChromeChannelBeta
},
84 bool is_system
= install
== SYSTEM_INSTALL
;
85 const wchar_t* prefixes
[] = {
90 const wchar_t* suffixes
[] = {
96 for (size_t i
= 0; i
< arraysize(prefixes
); ++i
) {
97 for (size_t j
= 0; j
< arraysize(expectations
); ++j
) {
98 for (size_t k
= 0; k
< arraysize(suffixes
); ++k
) {
99 std::wstring ap
= prefixes
[i
];
100 ap
+= expectations
[j
].ap_value
;
102 const wchar_t* channel
= expectations
[j
].channel
;
104 SetApField(install
, ap
.c_str());
105 base::string16 ret_channel
;
107 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(
108 is_system
, &ret_channel
));
109 EXPECT_STREQ(channel
, ret_channel
.c_str())
110 << "Expecting channel \"" << channel
111 << "\" for ap=\"" << ap
<< "\"";
117 // Test the writing and deleting functionality of the experiments label
119 void TestExperimentsLabelHelper(SystemUserInstall install
) {
120 BrowserDistribution
* chrome
=
121 BrowserDistribution::GetSpecificDistribution(
122 BrowserDistribution::CHROME_BROWSER
);
124 #if defined(GOOGLE_CHROME_BUILD)
125 EXPECT_TRUE(chrome
->ShouldSetExperimentLabels());
127 // Before anything is set, ReadExperimentLabels should succeed but return
129 EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
130 install
== SYSTEM_INSTALL
, &value
));
131 EXPECT_EQ(base::string16(), value
);
133 EXPECT_TRUE(GoogleUpdateSettings::SetExperimentLabels(
134 install
== SYSTEM_INSTALL
, kTestExperimentLabel
));
136 // Validate that something is written. Only worry about the label itself.
138 HKEY root
= install
== SYSTEM_INSTALL
?
139 HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
;
140 base::string16 state_key
= install
== SYSTEM_INSTALL
?
141 chrome
->GetStateMediumKey() : chrome
->GetStateKey();
143 EXPECT_EQ(ERROR_SUCCESS
,
144 key
.Open(root
, state_key
.c_str(), KEY_QUERY_VALUE
));
145 EXPECT_EQ(ERROR_SUCCESS
,
146 key
.ReadValue(google_update::kExperimentLabels
, &value
));
147 EXPECT_EQ(kTestExperimentLabel
, value
);
148 EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
149 install
== SYSTEM_INSTALL
, &value
));
150 EXPECT_EQ(kTestExperimentLabel
, value
);
153 // Now that the label is set, test the delete functionality. An empty label
154 // should result in deleting the value.
155 EXPECT_TRUE(GoogleUpdateSettings::SetExperimentLabels(
156 install
== SYSTEM_INSTALL
, base::string16()));
157 EXPECT_EQ(ERROR_SUCCESS
,
158 key
.Open(root
, state_key
.c_str(), KEY_QUERY_VALUE
));
159 EXPECT_EQ(ERROR_FILE_NOT_FOUND
,
160 key
.ReadValue(google_update::kExperimentLabels
, &value
));
161 EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
162 install
== SYSTEM_INSTALL
, &value
));
163 EXPECT_EQ(base::string16(), value
);
166 EXPECT_FALSE(chrome
->ShouldSetExperimentLabels());
167 EXPECT_FALSE(GoogleUpdateSettings::ReadExperimentLabels(
168 install
== SYSTEM_INSTALL
, &value
));
169 #endif // GOOGLE_CHROME_BUILD
172 // Creates "ap" key with the value given as parameter. Also adds work
173 // items to work_item_list given so that they can be rolled back later.
174 bool CreateApKey(WorkItemList
* work_item_list
, const std::wstring
& value
) {
175 HKEY reg_root
= HKEY_CURRENT_USER
;
176 std::wstring reg_key
= GetApKeyPath();
177 work_item_list
->AddCreateRegKeyWorkItem(reg_root
, reg_key
);
178 work_item_list
->AddSetRegValueWorkItem(reg_root
, reg_key
,
179 google_update::kRegApField
, value
.c_str(), true);
180 if (!work_item_list
->Do()) {
181 work_item_list
->Rollback();
187 // Returns the key path of "ap" key, e.g.:
188 // Google\Update\ClientState\<kTestProductGuid>
189 std::wstring
GetApKeyPath() {
190 std::wstring
reg_key(google_update::kRegPathClientState
);
191 reg_key
.append(L
"\\");
192 reg_key
.append(kTestProductGuid
);
196 // Utility method to read "ap" key value
197 std::wstring
ReadApKeyValue() {
199 std::wstring ap_key_value
;
200 std::wstring reg_key
= GetApKeyPath();
201 if (key
.Open(HKEY_CURRENT_USER
, reg_key
.c_str(), KEY_ALL_ACCESS
) ==
203 key
.ReadValue(google_update::kRegApField
, &ap_key_value
);
209 registry_util::RegistryOverrideManager registry_overrides_
;
214 // Verify that we return success on no registration (which means stable),
215 // whether per-system or per-user install.
216 TEST_F(GoogleUpdateSettingsTest
, CurrentChromeChannelAbsent
) {
218 base::string16 channel
;
219 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
221 EXPECT_STREQ(L
"", channel
.c_str());
224 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
226 EXPECT_STREQ(L
"", channel
.c_str());
229 // Test an empty Ap key for system and user.
230 TEST_F(GoogleUpdateSettingsTest
, CurrentChromeChannelEmptySystem
) {
231 SetApField(SYSTEM_INSTALL
, L
"");
232 base::string16 channel
;
233 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
235 EXPECT_STREQ(L
"", channel
.c_str());
237 // Per-user lookups still succeed and return empty string.
238 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
240 EXPECT_STREQ(L
"", channel
.c_str());
243 TEST_F(GoogleUpdateSettingsTest
, CurrentChromeChannelEmptyUser
) {
244 SetApField(USER_INSTALL
, L
"");
245 // Per-system lookups still succeed and return empty string.
246 base::string16 channel
;
247 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
249 EXPECT_STREQ(L
"", channel
.c_str());
251 // Per-user lookup should succeed.
252 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
254 EXPECT_STREQ(L
"", channel
.c_str());
257 TEST_F(GoogleUpdateSettingsTest
, CurrentChromeChannelVariousApValuesSystem
) {
258 TestCurrentChromeChannelWithVariousApValues(SYSTEM_INSTALL
);
261 TEST_F(GoogleUpdateSettingsTest
, CurrentChromeChannelVariousApValuesUser
) {
262 TestCurrentChromeChannelWithVariousApValues(USER_INSTALL
);
265 // Run through all combinations of diff vs. full install, single vs. multi
266 // install, success and failure results, and a fistful of initial "ap" values
267 // checking that the expected final "ap" value is generated by
268 // GoogleUpdateSettings::UpdateGoogleUpdateApKey.
269 TEST_F(GoogleUpdateSettingsTest
, UpdateGoogleUpdateApKey
) {
270 const installer::ArchiveType archive_types
[] = {
271 installer::UNKNOWN_ARCHIVE_TYPE
,
272 installer::FULL_ARCHIVE_TYPE
,
273 installer::INCREMENTAL_ARCHIVE_TYPE
275 const int results
[] = {
276 installer::FIRST_INSTALL_SUCCESS
,
277 installer::INSTALL_FAILED
279 const wchar_t* const plain
[] = {
284 const wchar_t* const full
[] = {
289 COMPILE_ASSERT(arraysize(full
) == arraysize(plain
), bad_full_array_size
);
290 const wchar_t* const multifail
[] = {
295 COMPILE_ASSERT(arraysize(multifail
) == arraysize(plain
),
296 bad_multifail_array_size
);
297 const wchar_t* const multifail_full
[] = {
299 L
"1.1-multifail-full",
300 L
"1.1-dev-multifail-full"
302 COMPILE_ASSERT(arraysize(multifail_full
) == arraysize(plain
),
303 bad_multifail_full_array_size
);
304 const wchar_t* const* input_arrays
[] = {
311 for (int type_idx
= 0; type_idx
< arraysize(archive_types
); ++type_idx
) {
312 const installer::ArchiveType archive_type
= archive_types
[type_idx
];
313 for (int result_idx
= 0; result_idx
< arraysize(results
); ++result_idx
) {
314 const int result
= results
[result_idx
];
315 // The archive type will/must always be known on install success.
316 if (archive_type
== installer::UNKNOWN_ARCHIVE_TYPE
&&
317 result
== installer::FIRST_INSTALL_SUCCESS
) {
320 const wchar_t* const* outputs
= NULL
;
321 if (result
== installer::FIRST_INSTALL_SUCCESS
||
322 archive_type
== installer::FULL_ARCHIVE_TYPE
) {
324 } else if (archive_type
== installer::INCREMENTAL_ARCHIVE_TYPE
) {
326 } // else if (archive_type == UNKNOWN) see below
328 for (int inputs_idx
= 0; inputs_idx
< arraysize(input_arrays
);
330 const wchar_t* const* inputs
= input_arrays
[inputs_idx
];
331 if (archive_type
== installer::UNKNOWN_ARCHIVE_TYPE
) {
332 // "-full" is untouched if the archive type is unknown.
333 // "-multifail" is unconditionally removed.
334 if (inputs
== full
|| inputs
== multifail_full
)
339 for (int input_idx
= 0; input_idx
< arraysize(plain
); ++input_idx
) {
340 const wchar_t* input
= inputs
[input_idx
];
341 const wchar_t* output
= outputs
[input_idx
];
344 if (output
== v
.value()) {
345 EXPECT_FALSE(GoogleUpdateSettings::UpdateGoogleUpdateApKey(
346 archive_type
, result
, &v
))
347 << "archive_type: " << archive_type
348 << ", result: " << result
349 << ", input ap value: " << input
;
351 EXPECT_TRUE(GoogleUpdateSettings::UpdateGoogleUpdateApKey(
352 archive_type
, result
, &v
))
353 << "archive_type: " << archive_type
354 << ", result: " << result
355 << ", input ap value: " << input
;
357 EXPECT_EQ(output
, v
.value())
358 << "archive_type: " << archive_type
359 << ", result: " << result
360 << ", input ap value: " << input
;
367 TEST_F(GoogleUpdateSettingsTest
, UpdateInstallStatusTest
) {
368 scoped_ptr
<WorkItemList
> work_item_list(WorkItem::CreateWorkItemList());
369 // Test incremental install failure
370 ASSERT_TRUE(CreateApKey(work_item_list
.get(), L
""))
371 << "Failed to create ap key.";
372 GoogleUpdateSettings::UpdateInstallStatus(false,
373 installer::INCREMENTAL_ARCHIVE_TYPE
,
374 installer::INSTALL_FAILED
,
376 EXPECT_STREQ(ReadApKeyValue().c_str(), L
"-full");
377 work_item_list
->Rollback();
379 work_item_list
.reset(WorkItem::CreateWorkItemList());
380 // Test incremental install success
381 ASSERT_TRUE(CreateApKey(work_item_list
.get(), L
""))
382 << "Failed to create ap key.";
383 GoogleUpdateSettings::UpdateInstallStatus(false,
384 installer::INCREMENTAL_ARCHIVE_TYPE
,
385 installer::FIRST_INSTALL_SUCCESS
,
387 EXPECT_STREQ(ReadApKeyValue().c_str(), L
"");
388 work_item_list
->Rollback();
390 work_item_list
.reset(WorkItem::CreateWorkItemList());
391 // Test full install failure
392 ASSERT_TRUE(CreateApKey(work_item_list
.get(), L
"-full"))
393 << "Failed to create ap key.";
394 GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE
,
395 installer::INSTALL_FAILED
,
397 EXPECT_STREQ(ReadApKeyValue().c_str(), L
"");
398 work_item_list
->Rollback();
400 work_item_list
.reset(WorkItem::CreateWorkItemList());
401 // Test full install success
402 ASSERT_TRUE(CreateApKey(work_item_list
.get(), L
"-full"))
403 << "Failed to create ap key.";
404 GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE
,
405 installer::FIRST_INSTALL_SUCCESS
,
407 EXPECT_STREQ(ReadApKeyValue().c_str(), L
"");
408 work_item_list
->Rollback();
410 work_item_list
.reset(WorkItem::CreateWorkItemList());
411 // Test the case of when "ap" key doesnt exist at all
412 std::wstring ap_key_value
= ReadApKeyValue();
413 std::wstring reg_key
= GetApKeyPath();
414 HKEY reg_root
= HKEY_CURRENT_USER
;
415 bool ap_key_deleted
= false;
417 if (key
.Open(HKEY_CURRENT_USER
, reg_key
.c_str(), KEY_ALL_ACCESS
) !=
419 work_item_list
->AddCreateRegKeyWorkItem(reg_root
, reg_key
);
420 ASSERT_TRUE(work_item_list
->Do()) << "Failed to create ClientState key.";
421 } else if (key
.DeleteValue(google_update::kRegApField
) == ERROR_SUCCESS
) {
422 ap_key_deleted
= true;
424 // try differential installer
425 GoogleUpdateSettings::UpdateInstallStatus(false,
426 installer::INCREMENTAL_ARCHIVE_TYPE
,
427 installer::INSTALL_FAILED
,
429 EXPECT_STREQ(ReadApKeyValue().c_str(), L
"-full");
430 // try full installer now
431 GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE
,
432 installer::INSTALL_FAILED
,
434 EXPECT_STREQ(ReadApKeyValue().c_str(), L
"");
435 // Now cleanup to leave the system in unchanged state.
436 // - Diff installer creates an ap key if it didnt exist, so delete this ap key
437 // - If we created any reg key path for ap, roll it back
438 // - Finally restore the original value of ap key.
439 key
.Open(HKEY_CURRENT_USER
, reg_key
.c_str(), KEY_ALL_ACCESS
);
440 key
.DeleteValue(google_update::kRegApField
);
441 work_item_list
->Rollback();
442 if (ap_key_deleted
) {
443 work_item_list
.reset(WorkItem::CreateWorkItemList());
444 ASSERT_TRUE(CreateApKey(work_item_list
.get(), ap_key_value
))
445 << "Failed to restore ap key.";
449 TEST_F(GoogleUpdateSettingsTest
, SetEULAConsent
) {
450 using installer::FakeInstallationState
;
452 const bool multi_install
= true;
453 const bool system_level
= true;
454 FakeInstallationState machine_state
;
456 // Chrome is installed.
457 machine_state
.AddChrome(system_level
, multi_install
,
458 new Version(chrome::kChromeVersion
));
462 BrowserDistribution
* binaries
=
463 BrowserDistribution::GetSpecificDistribution(
464 BrowserDistribution::CHROME_BINARIES
);
465 BrowserDistribution
* chrome
=
466 BrowserDistribution::GetSpecificDistribution(
467 BrowserDistribution::CHROME_BROWSER
);
469 // eulaconsent is set on both the product and the binaries.
470 EXPECT_TRUE(GoogleUpdateSettings::SetEULAConsent(machine_state
, chrome
,
472 EXPECT_EQ(ERROR_SUCCESS
,
473 key
.Open(HKEY_LOCAL_MACHINE
, binaries
->GetStateMediumKey().c_str(),
475 EXPECT_EQ(ERROR_SUCCESS
,
476 key
.ReadValueDW(google_update::kRegEULAAceptedField
, &value
));
477 EXPECT_EQ(1U, value
);
478 EXPECT_EQ(ERROR_SUCCESS
,
479 key
.Open(HKEY_LOCAL_MACHINE
, chrome
->GetStateMediumKey().c_str(),
481 EXPECT_EQ(ERROR_SUCCESS
,
482 key
.ReadValueDW(google_update::kRegEULAAceptedField
, &value
));
483 EXPECT_EQ(1U, value
);
486 // Test that the appropriate default is returned if no update override is
488 TEST_F(GoogleUpdateSettingsTest
, GetAppUpdatePolicyNoOverride
) {
489 // There are no policies at all.
490 EXPECT_EQ(ERROR_FILE_NOT_FOUND
,
491 RegKey().Open(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
493 bool is_overridden
= true;
494 EXPECT_EQ(kDefaultUpdatePolicy
,
495 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
497 EXPECT_FALSE(is_overridden
);
499 // The policy key exists, but there are no values of interest present.
500 EXPECT_EQ(ERROR_SUCCESS
,
501 RegKey().Create(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
503 EXPECT_EQ(ERROR_SUCCESS
,
504 RegKey().Open(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
506 is_overridden
= true;
507 EXPECT_EQ(kDefaultUpdatePolicy
,
508 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
510 EXPECT_FALSE(is_overridden
);
513 #if defined(GOOGLE_CHROME_BUILD)
515 // Test that the default override is returned if no app-specific override is
517 TEST_F(GoogleUpdateSettingsTest
, GetAppUpdatePolicyDefaultOverride
) {
518 EXPECT_EQ(ERROR_SUCCESS
,
519 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
520 KEY_SET_VALUE
).WriteValue(kGoogleUpdateUpdateDefault
,
521 static_cast<DWORD
>(0)));
522 bool is_overridden
= true;
523 EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED
,
524 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
526 EXPECT_FALSE(is_overridden
);
528 EXPECT_EQ(ERROR_SUCCESS
,
529 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
530 KEY_SET_VALUE
).WriteValue(kGoogleUpdateUpdateDefault
,
531 static_cast<DWORD
>(1)));
532 is_overridden
= true;
533 EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES
,
534 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
536 EXPECT_FALSE(is_overridden
);
538 EXPECT_EQ(ERROR_SUCCESS
,
539 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
540 KEY_SET_VALUE
).WriteValue(kGoogleUpdateUpdateDefault
,
541 static_cast<DWORD
>(2)));
542 is_overridden
= true;
543 EXPECT_EQ(GoogleUpdateSettings::MANUAL_UPDATES_ONLY
,
544 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
546 EXPECT_FALSE(is_overridden
);
548 EXPECT_EQ(ERROR_SUCCESS
,
549 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
550 KEY_SET_VALUE
).WriteValue(kGoogleUpdateUpdateDefault
,
551 static_cast<DWORD
>(3)));
552 is_overridden
= true;
553 EXPECT_EQ(GoogleUpdateSettings::AUTO_UPDATES_ONLY
,
554 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
556 EXPECT_FALSE(is_overridden
);
558 // The default policy should be in force for bogus values.
559 EXPECT_EQ(ERROR_SUCCESS
,
560 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
561 KEY_SET_VALUE
).WriteValue(kGoogleUpdateUpdateDefault
,
562 static_cast<DWORD
>(4)));
563 is_overridden
= true;
564 EXPECT_EQ(kDefaultUpdatePolicy
,
565 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
567 EXPECT_FALSE(is_overridden
);
570 // Test that an app-specific override is used if present.
571 TEST_F(GoogleUpdateSettingsTest
, GetAppUpdatePolicyAppOverride
) {
572 std::wstring
app_policy_value(kGoogleUpdateUpdatePrefix
);
573 app_policy_value
.append(kTestProductGuid
);
575 EXPECT_EQ(ERROR_SUCCESS
,
576 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
577 KEY_SET_VALUE
).WriteValue(kGoogleUpdateUpdateDefault
,
578 static_cast<DWORD
>(1)));
579 EXPECT_EQ(ERROR_SUCCESS
,
580 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
581 KEY_SET_VALUE
).WriteValue(app_policy_value
.c_str(),
582 static_cast<DWORD
>(0)));
583 bool is_overridden
= false;
584 EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED
,
585 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
587 EXPECT_TRUE(is_overridden
);
589 EXPECT_EQ(ERROR_SUCCESS
,
590 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
591 KEY_SET_VALUE
).WriteValue(kGoogleUpdateUpdateDefault
,
592 static_cast<DWORD
>(0)));
593 EXPECT_EQ(ERROR_SUCCESS
,
594 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
595 KEY_SET_VALUE
).WriteValue(app_policy_value
.c_str(),
596 static_cast<DWORD
>(1)));
597 is_overridden
= false;
598 EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES
,
599 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
601 EXPECT_TRUE(is_overridden
);
603 EXPECT_EQ(ERROR_SUCCESS
,
604 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
605 KEY_SET_VALUE
).WriteValue(app_policy_value
.c_str(),
606 static_cast<DWORD
>(2)));
607 is_overridden
= false;
608 EXPECT_EQ(GoogleUpdateSettings::MANUAL_UPDATES_ONLY
,
609 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
611 EXPECT_TRUE(is_overridden
);
613 EXPECT_EQ(ERROR_SUCCESS
,
614 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
615 KEY_SET_VALUE
).WriteValue(app_policy_value
.c_str(),
616 static_cast<DWORD
>(3)));
617 is_overridden
= false;
618 EXPECT_EQ(GoogleUpdateSettings::AUTO_UPDATES_ONLY
,
619 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
621 EXPECT_TRUE(is_overridden
);
623 // The default policy should be in force for bogus values.
624 EXPECT_EQ(ERROR_SUCCESS
,
625 RegKey(HKEY_LOCAL_MACHINE
, kGoogleUpdatePoliciesKey
,
626 KEY_SET_VALUE
).WriteValue(app_policy_value
.c_str(),
627 static_cast<DWORD
>(4)));
628 is_overridden
= true;
629 EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED
,
630 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid
,
632 EXPECT_FALSE(is_overridden
);
635 TEST_F(GoogleUpdateSettingsTest
, ExperimentsLabelHelperSystem
) {
636 TestExperimentsLabelHelper(SYSTEM_INSTALL
);
639 TEST_F(GoogleUpdateSettingsTest
, ExperimentsLabelHelperUser
) {
640 TestExperimentsLabelHelper(USER_INSTALL
);
643 #endif // defined(GOOGLE_CHROME_BUILD)
645 // Test GoogleUpdateSettings::GetUninstallCommandLine at system- or user-level,
646 // according to the param.
647 class GetUninstallCommandLine
: public GoogleUpdateSettingsTest
,
648 public testing::WithParamInterface
<bool> {
650 static const wchar_t kDummyCommand
[];
652 virtual void SetUp() OVERRIDE
{
653 GoogleUpdateSettingsTest::SetUp();
654 system_install_
= GetParam();
655 root_key_
= system_install_
? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
;
659 bool system_install_
;
662 const wchar_t GetUninstallCommandLine::kDummyCommand
[] =
663 L
"\"goopdate.exe\" /spam";
665 // Tests that GetUninstallCommandLine returns an empty string if there's no
666 // Software\Google\Update key.
667 TEST_P(GetUninstallCommandLine
, TestNoKey
) {
668 EXPECT_EQ(base::string16(),
669 GoogleUpdateSettings::GetUninstallCommandLine(system_install_
));
672 // Tests that GetUninstallCommandLine returns an empty string if there's no
673 // UninstallCmdLine value in the Software\Google\Update key.
674 TEST_P(GetUninstallCommandLine
, TestNoValue
) {
675 RegKey(root_key_
, google_update::kRegPathGoogleUpdate
, KEY_SET_VALUE
);
676 EXPECT_EQ(base::string16(),
677 GoogleUpdateSettings::GetUninstallCommandLine(system_install_
));
680 // Tests that GetUninstallCommandLine returns an empty string if there's an
681 // empty UninstallCmdLine value in the Software\Google\Update key.
682 TEST_P(GetUninstallCommandLine
, TestEmptyValue
) {
683 RegKey(root_key_
, google_update::kRegPathGoogleUpdate
, KEY_SET_VALUE
)
684 .WriteValue(google_update::kRegUninstallCmdLine
, L
"");
685 EXPECT_EQ(base::string16(),
686 GoogleUpdateSettings::GetUninstallCommandLine(system_install_
));
689 // Tests that GetUninstallCommandLine returns the correct string if there's an
690 // UninstallCmdLine value in the Software\Google\Update key.
691 TEST_P(GetUninstallCommandLine
, TestRealValue
) {
692 RegKey(root_key_
, google_update::kRegPathGoogleUpdate
, KEY_SET_VALUE
)
693 .WriteValue(google_update::kRegUninstallCmdLine
, kDummyCommand
);
694 EXPECT_EQ(base::string16(kDummyCommand
),
695 GoogleUpdateSettings::GetUninstallCommandLine(system_install_
));
696 // Make sure that there's no value in the other level (user or system).
697 EXPECT_EQ(base::string16(),
698 GoogleUpdateSettings::GetUninstallCommandLine(!system_install_
));
701 INSTANTIATE_TEST_CASE_P(GetUninstallCommandLineAtLevel
, GetUninstallCommandLine
,
704 // Test GoogleUpdateSettings::GetGoogleUpdateVersion at system- or user-level,
705 // according to the param.
706 class GetGoogleUpdateVersion
: public GoogleUpdateSettingsTest
,
707 public testing::WithParamInterface
<bool> {
709 static const wchar_t kDummyVersion
[];
711 virtual void SetUp() OVERRIDE
{
712 GoogleUpdateSettingsTest::SetUp();
713 system_install_
= GetParam();
714 root_key_
= system_install_
? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
;
718 bool system_install_
;
721 const wchar_t GetGoogleUpdateVersion::kDummyVersion
[] = L
"1.2.3.4";
723 // Tests that GetGoogleUpdateVersion returns an empty string if there's no
724 // Software\Google\Update key.
725 TEST_P(GetGoogleUpdateVersion
, TestNoKey
) {
727 GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_
).IsValid());
730 // Tests that GetGoogleUpdateVersion returns an empty string if there's no
731 // version value in the Software\Google\Update key.
732 TEST_P(GetGoogleUpdateVersion
, TestNoValue
) {
733 RegKey(root_key_
, google_update::kRegPathGoogleUpdate
, KEY_SET_VALUE
);
735 GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_
).IsValid());
738 // Tests that GetGoogleUpdateVersion returns an empty string if there's an
739 // empty version value in the Software\Google\Update key.
740 TEST_P(GetGoogleUpdateVersion
, TestEmptyValue
) {
741 RegKey(root_key_
, google_update::kRegPathGoogleUpdate
, KEY_SET_VALUE
)
742 .WriteValue(google_update::kRegGoogleUpdateVersion
, L
"");
744 GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_
).IsValid());
747 // Tests that GetGoogleUpdateVersion returns the correct string if there's a
748 // version value in the Software\Google\Update key.
749 TEST_P(GetGoogleUpdateVersion
, TestRealValue
) {
750 RegKey(root_key_
, google_update::kRegPathGoogleUpdate
, KEY_SET_VALUE
)
751 .WriteValue(google_update::kRegGoogleUpdateVersion
, kDummyVersion
);
752 Version
expected(base::UTF16ToUTF8(kDummyVersion
));
753 EXPECT_TRUE(expected
.Equals(
754 GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_
)));
755 // Make sure that there's no value in the other level (user or system).
757 GoogleUpdateSettings::GetGoogleUpdateVersion(!system_install_
)
761 INSTANTIATE_TEST_CASE_P(GetGoogleUpdateVersionAtLevel
, GetGoogleUpdateVersion
,
764 // Test values for use by the CollectStatsConsent test fixture.
776 struct UserLevelState
{};
777 struct SystemLevelState
{};
778 static const UserLevelState kUserLevel
;
779 static const SystemLevelState kSystemLevel
;
781 StatsState(const UserLevelState
&,
782 InstallType install_type
,
783 StateSetting state_value
)
784 : system_level_(false),
785 multi_install_(install_type
== MULTI_INSTALL
),
786 state_value_(state_value
),
787 state_medium_value_(NO_SETTING
) {
789 StatsState(const SystemLevelState
&,
790 InstallType install_type
,
791 StateSetting state_value
,
792 StateSetting state_medium_value
)
793 : system_level_(true),
794 multi_install_(install_type
== MULTI_INSTALL
),
795 state_value_(state_value
),
796 state_medium_value_(state_medium_value
) {
798 bool system_level() const { return system_level_
; }
799 bool multi_install() const { return multi_install_
; }
800 HKEY
root_key() const {
801 return system_level_
? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
;
803 StateSetting
state_value() const { return state_value_
; }
804 StateSetting
state_medium_value() const {
805 return state_medium_value_
;
807 bool is_consent_granted() const {
808 return (system_level_
&& state_medium_value_
!= NO_SETTING
) ?
809 (state_medium_value_
== TRUE_SETTING
) :
810 (state_value_
== TRUE_SETTING
);
815 StateSetting state_value_
;
816 StateSetting state_medium_value_
;
819 const StatsState::UserLevelState
StatsState::kUserLevel
;
820 const StatsState::SystemLevelState
StatsState::kSystemLevel
;
822 // A value parameterized test for testing the stats collection consent setting.
823 class CollectStatsConsent
: public ::testing::TestWithParam
<StatsState
> {
825 static void SetUpTestCase();
826 static void TearDownTestCase();
828 virtual void SetUp() OVERRIDE
;
829 static void MakeChromeMultiInstall(HKEY root_key
);
830 static void ApplySetting(StatsState::StateSetting setting
,
832 const std::wstring
& reg_key
);
834 static std::wstring
* chrome_version_key_
;
835 static std::wstring
* chrome_state_key_
;
836 static std::wstring
* chrome_state_medium_key_
;
837 static std::wstring
* binaries_state_key_
;
838 static std::wstring
* binaries_state_medium_key_
;
839 registry_util::RegistryOverrideManager override_manager_
;
842 std::wstring
* CollectStatsConsent::chrome_version_key_
;
843 std::wstring
* CollectStatsConsent::chrome_state_key_
;
844 std::wstring
* CollectStatsConsent::chrome_state_medium_key_
;
845 std::wstring
* CollectStatsConsent::binaries_state_key_
;
846 std::wstring
* CollectStatsConsent::binaries_state_medium_key_
;
848 void CollectStatsConsent::SetUpTestCase() {
849 BrowserDistribution
* dist
=
850 BrowserDistribution::GetSpecificDistribution(
851 BrowserDistribution::CHROME_BROWSER
);
852 chrome_version_key_
= new std::wstring(dist
->GetVersionKey());
853 chrome_state_key_
= new std::wstring(dist
->GetStateKey());
854 chrome_state_medium_key_
= new std::wstring(dist
->GetStateMediumKey());
856 dist
= BrowserDistribution::GetSpecificDistribution(
857 BrowserDistribution::CHROME_BINARIES
);
858 binaries_state_key_
= new std::wstring(dist
->GetStateKey());
859 binaries_state_medium_key_
= new std::wstring(dist
->GetStateMediumKey());
862 void CollectStatsConsent::TearDownTestCase() {
863 delete chrome_version_key_
;
864 delete chrome_state_key_
;
865 delete chrome_state_medium_key_
;
866 delete binaries_state_key_
;
867 delete binaries_state_medium_key_
;
870 // Install the registry override and apply the settings to the registry.
871 void CollectStatsConsent::SetUp() {
872 const StatsState
& stats_state
= GetParam();
873 const HKEY root_key
= stats_state
.root_key();
874 std::wstring
reg_temp_name(stats_state
.system_level() ? L
"HKLM_" : L
"HKCU_");
875 reg_temp_name
+= L
"CollectStatsConsent";
876 override_manager_
.OverrideRegistry(root_key
, reg_temp_name
);
878 if (stats_state
.multi_install()) {
879 MakeChromeMultiInstall(root_key
);
880 ApplySetting(stats_state
.state_value(), root_key
, *binaries_state_key_
);
881 ApplySetting(stats_state
.state_medium_value(), root_key
,
882 *binaries_state_medium_key_
);
884 ApplySetting(stats_state
.state_value(), root_key
, *chrome_state_key_
);
885 ApplySetting(stats_state
.state_medium_value(), root_key
,
886 *chrome_state_medium_key_
);
890 // Write values into the registry so that Chrome is considered to be installed
892 void CollectStatsConsent::MakeChromeMultiInstall(HKEY root_key
) {
895 RegKey(root_key
, chrome_version_key_
->c_str(),
896 KEY_SET_VALUE
).WriteValue(google_update::kRegVersionField
,
900 RegKey(root_key
, chrome_state_key_
->c_str(),
901 KEY_SET_VALUE
).WriteValue(installer::kUninstallArgumentsField
,
902 L
"--multi-install"));
905 // Write the correct value to represent |setting| in the registry.
906 void CollectStatsConsent::ApplySetting(StatsState::StateSetting setting
,
908 const std::wstring
& reg_key
) {
909 if (setting
!= StatsState::NO_SETTING
) {
910 DWORD value
= setting
!= StatsState::FALSE_SETTING
? 1 : 0;
913 RegKey(root_key
, reg_key
.c_str(),
914 KEY_SET_VALUE
).WriteValue(google_update::kRegUsageStatsField
,
919 // Test that stats consent can be read.
920 TEST_P(CollectStatsConsent
, GetCollectStatsConsentAtLevel
) {
921 if (GetParam().is_consent_granted()) {
922 EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
923 GetParam().system_level()));
925 EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
926 GetParam().system_level()));
930 // Test that stats consent can be flipped to the opposite setting, that the new
931 // setting takes affect, and that the correct registry location is modified.
932 TEST_P(CollectStatsConsent
, SetCollectStatsConsentAtLevel
) {
933 EXPECT_TRUE(GoogleUpdateSettings::SetCollectStatsConsentAtLevel(
934 GetParam().system_level(),
935 !GetParam().is_consent_granted()));
936 const std::wstring
* const reg_keys
[] = {
938 chrome_state_medium_key_
,
940 binaries_state_medium_key_
,
942 int key_index
= ((GetParam().system_level() ? 1 : 0) +
943 (GetParam().multi_install() ? 2 : 0));
944 const std::wstring
& reg_key
= *reg_keys
[key_index
];
948 RegKey(GetParam().root_key(), reg_key
.c_str(),
949 KEY_QUERY_VALUE
).ReadValueDW(google_update::kRegUsageStatsField
,
951 if (GetParam().is_consent_granted()) {
952 EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
953 GetParam().system_level()));
954 EXPECT_EQ(0UL, value
);
956 EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
957 GetParam().system_level()));
958 EXPECT_EQ(1UL, value
);
962 INSTANTIATE_TEST_CASE_P(
963 UserLevelSingleInstall
,
966 StatsState(StatsState::kUserLevel
, StatsState::SINGLE_INSTALL
,
967 StatsState::NO_SETTING
),
968 StatsState(StatsState::kUserLevel
, StatsState::SINGLE_INSTALL
,
969 StatsState::FALSE_SETTING
),
970 StatsState(StatsState::kUserLevel
, StatsState::SINGLE_INSTALL
,
971 StatsState::TRUE_SETTING
)));
972 INSTANTIATE_TEST_CASE_P(
973 UserLevelMultiInstall
,
976 StatsState(StatsState::kUserLevel
, StatsState::MULTI_INSTALL
,
977 StatsState::NO_SETTING
),
978 StatsState(StatsState::kUserLevel
, StatsState::MULTI_INSTALL
,
979 StatsState::FALSE_SETTING
),
980 StatsState(StatsState::kUserLevel
, StatsState::MULTI_INSTALL
,
981 StatsState::TRUE_SETTING
)));
982 INSTANTIATE_TEST_CASE_P(
983 SystemLevelSingleInstall
,
986 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
987 StatsState::NO_SETTING
, StatsState::NO_SETTING
),
988 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
989 StatsState::NO_SETTING
, StatsState::FALSE_SETTING
),
990 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
991 StatsState::NO_SETTING
, StatsState::TRUE_SETTING
),
992 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
993 StatsState::FALSE_SETTING
, StatsState::NO_SETTING
),
994 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
995 StatsState::FALSE_SETTING
, StatsState::FALSE_SETTING
),
996 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
997 StatsState::FALSE_SETTING
, StatsState::TRUE_SETTING
),
998 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
999 StatsState::TRUE_SETTING
, StatsState::NO_SETTING
),
1000 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
1001 StatsState::TRUE_SETTING
, StatsState::FALSE_SETTING
),
1002 StatsState(StatsState::kSystemLevel
, StatsState::SINGLE_INSTALL
,
1003 StatsState::TRUE_SETTING
, StatsState::TRUE_SETTING
)));
1004 INSTANTIATE_TEST_CASE_P(
1005 SystemLevelMultiInstall
,
1006 CollectStatsConsent
,
1008 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1009 StatsState::NO_SETTING
, StatsState::NO_SETTING
),
1010 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1011 StatsState::NO_SETTING
, StatsState::FALSE_SETTING
),
1012 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1013 StatsState::NO_SETTING
, StatsState::TRUE_SETTING
),
1014 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1015 StatsState::FALSE_SETTING
, StatsState::NO_SETTING
),
1016 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1017 StatsState::FALSE_SETTING
, StatsState::FALSE_SETTING
),
1018 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1019 StatsState::FALSE_SETTING
, StatsState::TRUE_SETTING
),
1020 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1021 StatsState::TRUE_SETTING
, StatsState::NO_SETTING
),
1022 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1023 StatsState::TRUE_SETTING
, StatsState::FALSE_SETTING
),
1024 StatsState(StatsState::kSystemLevel
, StatsState::MULTI_INSTALL
,
1025 StatsState::TRUE_SETTING
, StatsState::TRUE_SETTING
)));