google_update_settings_unittest.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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. 4 5#include <windows.h> 6#include <shlwapi.h> // For SHDeleteKey. 7 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" 22 23using base::win::RegKey; 24using installer::ChannelInfo; 25 26namespace { 27 28const wchar_t kTestProductGuid[] = L"{89F1B351-B15D-48D4-8F10-1298721CF13D}"; 29const wchar_t kTestExperimentLabel[] = L"test_label_value"; 30 31// This test fixture redirects the HKLM and HKCU registry hives for 32// the duration of the test to make it independent of the machine 33// and user settings. 34class GoogleUpdateSettingsTest : public testing::Test { 35 protected: 36 virtual void SetUp() OVERRIDE { 37 registry_overrides_.OverrideRegistry(HKEY_LOCAL_MACHINE, L"HKLM_pit"); 38 registry_overrides_.OverrideRegistry(HKEY_CURRENT_USER, L"HKCU_pit"); 39 } 40 41 enum SystemUserInstall { 42 SYSTEM_INSTALL, 43 USER_INSTALL, 44 }; 45 46 void SetApField(SystemUserInstall is_system, const wchar_t* value) { 47 HKEY root = is_system == SYSTEM_INSTALL ? 48 HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 49 50 RegKey update_key; 51 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 52 std::wstring path = dist->GetStateKey(); 53 ASSERT_EQ(ERROR_SUCCESS, update_key.Create(root, path.c_str(), KEY_WRITE)); 54 ASSERT_EQ(ERROR_SUCCESS, update_key.WriteValue(L"ap", value)); 55 } 56 57 // Tests setting the ap= value to various combinations of values with 58 // prefixes and suffixes, while asserting on the correct channel value. 59 // Note that any non-empty ap= value that doesn't match ".*-{dev|beta}.*" 60 // will return the "unknown" channel. 61 void TestCurrentChromeChannelWithVariousApValues(SystemUserInstall install) { 62 static struct Expectations { 63 const wchar_t* ap_value; 64 const wchar_t* channel; 65 } expectations[] = { 66 { L"dev", installer::kChromeChannelDev }, 67 { L"-dev", installer::kChromeChannelDev }, 68 { L"-developer", installer::kChromeChannelDev }, 69 { L"beta", installer::kChromeChannelBeta }, 70 { L"-beta", installer::kChromeChannelBeta }, 71 { L"-betamax", installer::kChromeChannelBeta }, 72 }; 73 bool is_system = install == SYSTEM_INSTALL; 74 const wchar_t* prefixes[] = { 75 L"", 76 L"prefix", 77 L"prefix-with-dash", 78 }; 79 const wchar_t* suffixes[] = { 80 L"", 81 L"suffix", 82 L"suffix-with-dash", 83 }; 84 85 for (size_t i = 0; i < arraysize(prefixes); ++i) { 86 for (size_t j = 0; j < arraysize(expectations); ++j) { 87 for (size_t k = 0; k < arraysize(suffixes); ++k) { 88 std::wstring ap = prefixes[i]; 89 ap += expectations[j].ap_value; 90 ap += suffixes[k]; 91 const wchar_t* channel = expectations[j].channel; 92 93 SetApField(install, ap.c_str()); 94 base::string16 ret_channel; 95 96 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers( 97 is_system, &ret_channel)); 98 EXPECT_STREQ(channel, ret_channel.c_str()) 99 << "Expecting channel \"" << channel 100 << "\" for ap=\"" << ap << "\""; 101 } 102 } 103 } 104 } 105 106 // Test the writing and deleting functionality of the experiments label 107 // helper. 108 void TestExperimentsLabelHelper(SystemUserInstall install) { 109 BrowserDistribution* chrome = 110 BrowserDistribution::GetSpecificDistribution( 111 BrowserDistribution::CHROME_BROWSER); 112 std::wstring value; 113#if defined(GOOGLE_CHROME_BUILD) 114 EXPECT_TRUE(chrome->ShouldSetExperimentLabels()); 115 116 // Before anything is set, ReadExperimentLabels should succeed but return 117 // an empty string. 118 EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels( 119 install == SYSTEM_INSTALL, &value)); 120 EXPECT_EQ(base::string16(), value); 121 122 EXPECT_TRUE(GoogleUpdateSettings::SetExperimentLabels( 123 install == SYSTEM_INSTALL, kTestExperimentLabel)); 124 125 // Validate that something is written. Only worry about the label itself. 126 RegKey key; 127 HKEY root = install == SYSTEM_INSTALL ? 128 HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 129 base::string16 state_key = install == SYSTEM_INSTALL ? 130 chrome->GetStateMediumKey() : chrome->GetStateKey(); 131 132 EXPECT_EQ(ERROR_SUCCESS, 133 key.Open(root, state_key.c_str(), KEY_QUERY_VALUE)); 134 EXPECT_EQ(ERROR_SUCCESS, 135 key.ReadValue(google_update::kExperimentLabels, &value)); 136 EXPECT_EQ(kTestExperimentLabel, value); 137 EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels( 138 install == SYSTEM_INSTALL, &value)); 139 EXPECT_EQ(kTestExperimentLabel, value); 140 key.Close(); 141 142 // Now that the label is set, test the delete functionality. An empty label 143 // should result in deleting the value. 144 EXPECT_TRUE(GoogleUpdateSettings::SetExperimentLabels( 145 install == SYSTEM_INSTALL, base::string16())); 146 EXPECT_EQ(ERROR_SUCCESS, 147 key.Open(root, state_key.c_str(), KEY_QUERY_VALUE)); 148 EXPECT_EQ(ERROR_FILE_NOT_FOUND, 149 key.ReadValue(google_update::kExperimentLabels, &value)); 150 EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels( 151 install == SYSTEM_INSTALL, &value)); 152 EXPECT_EQ(base::string16(), value); 153 key.Close(); 154#else 155 EXPECT_FALSE(chrome->ShouldSetExperimentLabels()); 156 EXPECT_FALSE(GoogleUpdateSettings::ReadExperimentLabels( 157 install == SYSTEM_INSTALL, &value)); 158#endif // GOOGLE_CHROME_BUILD 159 } 160 161 // Creates "ap" key with the value given as parameter. Also adds work 162 // items to work_item_list given so that they can be rolled back later. 163 bool CreateApKey(WorkItemList* work_item_list, const std::wstring& value) { 164 HKEY reg_root = HKEY_CURRENT_USER; 165 std::wstring reg_key = GetApKeyPath(); 166 work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key); 167 work_item_list->AddSetRegValueWorkItem(reg_root, reg_key, 168 google_update::kRegApField, value.c_str(), true); 169 if (!work_item_list->Do()) { 170 work_item_list->Rollback(); 171 return false; 172 } 173 return true; 174 } 175 176 // Returns the key path of "ap" key, e.g.: 177 // Google\Update\ClientState\<kTestProductGuid> 178 std::wstring GetApKeyPath() { 179 std::wstring reg_key(google_update::kRegPathClientState); 180 reg_key.append(L"\\"); 181 reg_key.append(kTestProductGuid); 182 return reg_key; 183 } 184 185 // Utility method to read "ap" key value 186 std::wstring ReadApKeyValue() { 187 RegKey key; 188 std::wstring ap_key_value; 189 std::wstring reg_key = GetApKeyPath(); 190 if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) == 191 ERROR_SUCCESS) { 192 key.ReadValue(google_update::kRegApField, &ap_key_value); 193 } 194 195 return ap_key_value; 196 } 197 198 bool SetUpdatePolicyForAppGuid(const base::string16& app_guid, 199 GoogleUpdateSettings::UpdatePolicy policy) { 200 RegKey policy_key; 201 if (policy_key.Create(HKEY_LOCAL_MACHINE, 202 GoogleUpdateSettings::kPoliciesKey, 203 KEY_SET_VALUE) == ERROR_SUCCESS) { 204 base::string16 app_update_override( 205 GoogleUpdateSettings::kUpdateOverrideValuePrefix); 206 app_update_override.append(app_guid); 207 return policy_key.WriteValue(app_update_override.c_str(), 208 static_cast<DWORD>(policy)) == ERROR_SUCCESS; 209 } 210 return false; 211 } 212 213 DWORD GetUpdatePolicyForAppGuid(const base::string16& app_guid) { 214 RegKey policy_key; 215 if (policy_key.Create(HKEY_LOCAL_MACHINE, 216 GoogleUpdateSettings::kPoliciesKey, 217 KEY_QUERY_VALUE) == ERROR_SUCCESS) { 218 base::string16 app_update_override( 219 GoogleUpdateSettings::kUpdateOverrideValuePrefix); 220 app_update_override.append(app_guid); 221 222 DWORD value = -1; 223 if (policy_key.ReadValueDW(app_update_override.c_str(), 224 &value) == ERROR_SUCCESS) { 225 return value; 226 } 227 } 228 return -1; 229 } 230 231 bool SetGlobalUpdatePolicy(GoogleUpdateSettings::UpdatePolicy policy) { 232 RegKey policy_key; 233 return policy_key.Create(HKEY_LOCAL_MACHINE, 234 GoogleUpdateSettings::kPoliciesKey, 235 KEY_SET_VALUE) == ERROR_SUCCESS && 236 policy_key.WriteValue(GoogleUpdateSettings::kUpdatePolicyValue, 237 static_cast<DWORD>(policy)) == ERROR_SUCCESS; 238 } 239 240 DWORD GetGlobalUpdatePolicy() { 241 RegKey policy_key; 242 DWORD value = -1; 243 return (policy_key.Create(HKEY_LOCAL_MACHINE, 244 GoogleUpdateSettings::kPoliciesKey, 245 KEY_QUERY_VALUE) == ERROR_SUCCESS && 246 policy_key.ReadValueDW(GoogleUpdateSettings::kUpdatePolicyValue, 247 &value) == ERROR_SUCCESS) ? value : -1; 248 } 249 250 bool SetUpdateTimeoutOverride(DWORD time_in_minutes) { 251 RegKey policy_key; 252 return policy_key.Create(HKEY_LOCAL_MACHINE, 253 GoogleUpdateSettings::kPoliciesKey, 254 KEY_SET_VALUE) == ERROR_SUCCESS && 255 policy_key.WriteValue( 256 GoogleUpdateSettings::kCheckPeriodOverrideMinutes, 257 time_in_minutes) == ERROR_SUCCESS; 258 } 259 260 registry_util::RegistryOverrideManager registry_overrides_; 261}; 262 263} // namespace 264 265// Verify that we return success on no registration (which means stable), 266// whether per-system or per-user install. 267TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelAbsent) { 268 // Per-system first. 269 base::string16 channel; 270 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true, 271 &channel)); 272 EXPECT_STREQ(L"", channel.c_str()); 273 274 // Then per-user. 275 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false, 276 &channel)); 277 EXPECT_STREQ(L"", channel.c_str()); 278} 279 280// Test an empty Ap key for system and user. 281TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelEmptySystem) { 282 SetApField(SYSTEM_INSTALL, L""); 283 base::string16 channel; 284 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true, 285 &channel)); 286 EXPECT_STREQ(L"", channel.c_str()); 287 288 // Per-user lookups still succeed and return empty string. 289 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false, 290 &channel)); 291 EXPECT_STREQ(L"", channel.c_str()); 292} 293 294TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelEmptyUser) { 295 SetApField(USER_INSTALL, L""); 296 // Per-system lookups still succeed and return empty string. 297 base::string16 channel; 298 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true, 299 &channel)); 300 EXPECT_STREQ(L"", channel.c_str()); 301 302 // Per-user lookup should succeed. 303 EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false, 304 &channel)); 305 EXPECT_STREQ(L"", channel.c_str()); 306} 307 308TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelVariousApValuesSystem) { 309 TestCurrentChromeChannelWithVariousApValues(SYSTEM_INSTALL); 310} 311 312TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelVariousApValuesUser) { 313 TestCurrentChromeChannelWithVariousApValues(USER_INSTALL); 314} 315 316// Run through all combinations of diff vs. full install, single vs. multi 317// install, success and failure results, and a fistful of initial "ap" values 318// checking that the expected final "ap" value is generated by 319// GoogleUpdateSettings::UpdateGoogleUpdateApKey. 320TEST_F(GoogleUpdateSettingsTest, UpdateGoogleUpdateApKey) { 321 const installer::ArchiveType archive_types[] = { 322 installer::UNKNOWN_ARCHIVE_TYPE, 323 installer::FULL_ARCHIVE_TYPE, 324 installer::INCREMENTAL_ARCHIVE_TYPE 325 }; 326 const int results[] = { 327 installer::FIRST_INSTALL_SUCCESS, 328 installer::INSTALL_FAILED 329 }; 330 const wchar_t* const plain[] = { 331 L"", 332 L"1.1", 333 L"1.1-dev" 334 }; 335 const wchar_t* const full[] = { 336 L"-full", 337 L"1.1-full", 338 L"1.1-dev-full" 339 }; 340 COMPILE_ASSERT(arraysize(full) == arraysize(plain), bad_full_array_size); 341 const wchar_t* const multifail[] = { 342 L"-multifail", 343 L"1.1-multifail", 344 L"1.1-dev-multifail" 345 }; 346 COMPILE_ASSERT(arraysize(multifail) == arraysize(plain), 347 bad_multifail_array_size); 348 const wchar_t* const multifail_full[] = { 349 L"-multifail-full", 350 L"1.1-multifail-full", 351 L"1.1-dev-multifail-full" 352 }; 353 COMPILE_ASSERT(arraysize(multifail_full) == arraysize(plain), 354 bad_multifail_full_array_size); 355 const wchar_t* const* input_arrays[] = { 356 plain, 357 full, 358 multifail, 359 multifail_full 360 }; 361 ChannelInfo v; 362 for (int type_idx = 0; type_idx < arraysize(archive_types); ++type_idx) { 363 const installer::ArchiveType archive_type = archive_types[type_idx]; 364 for (int result_idx = 0; result_idx < arraysize(results); ++result_idx) { 365 const int result = results[result_idx]; 366 // The archive type will/must always be known on install success. 367 if (archive_type == installer::UNKNOWN_ARCHIVE_TYPE && 368 result == installer::FIRST_INSTALL_SUCCESS) { 369 continue; 370 } 371 const wchar_t* const* outputs = NULL; 372 if (result == installer::FIRST_INSTALL_SUCCESS || 373 archive_type == installer::FULL_ARCHIVE_TYPE) { 374 outputs = plain; 375 } else if (archive_type == installer::INCREMENTAL_ARCHIVE_TYPE) { 376 outputs = full; 377 } // else if (archive_type == UNKNOWN) see below 378 379 for (int inputs_idx = 0; inputs_idx < arraysize(input_arrays); 380 ++inputs_idx) { 381 const wchar_t* const* inputs = input_arrays[inputs_idx]; 382 if (archive_type == installer::UNKNOWN_ARCHIVE_TYPE) { 383 // "-full" is untouched if the archive type is unknown. 384 // "-multifail" is unconditionally removed. 385 if (inputs == full || inputs == multifail_full) 386 outputs = full; 387 else 388 outputs = plain; 389 } 390 for (int input_idx = 0; input_idx < arraysize(plain); ++input_idx) { 391 const wchar_t* input = inputs[input_idx]; 392 const wchar_t* output = outputs[input_idx]; 393 394 v.set_value(input); 395 if (output == v.value()) { 396 EXPECT_FALSE(GoogleUpdateSettings::UpdateGoogleUpdateApKey( 397 archive_type, result, &v)) 398 << "archive_type: " << archive_type 399 << ", result: " << result 400 << ", input ap value: " << input; 401 } else { 402 EXPECT_TRUE(GoogleUpdateSettings::UpdateGoogleUpdateApKey( 403 archive_type, result, &v)) 404 << "archive_type: " << archive_type 405 << ", result: " << result 406 << ", input ap value: " << input; 407 } 408 EXPECT_EQ(output, v.value()) 409 << "archive_type: " << archive_type 410 << ", result: " << result 411 << ", input ap value: " << input; 412 } 413 } 414 } 415 } 416} 417 418TEST_F(GoogleUpdateSettingsTest, UpdateInstallStatusTest) { 419 scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); 420 // Test incremental install failure 421 ASSERT_TRUE(CreateApKey(work_item_list.get(), L"")) 422 << "Failed to create ap key."; 423 GoogleUpdateSettings::UpdateInstallStatus(false, 424 installer::INCREMENTAL_ARCHIVE_TYPE, 425 installer::INSTALL_FAILED, 426 kTestProductGuid); 427 EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full"); 428 work_item_list->Rollback(); 429 430 work_item_list.reset(WorkItem::CreateWorkItemList()); 431 // Test incremental install success 432 ASSERT_TRUE(CreateApKey(work_item_list.get(), L"")) 433 << "Failed to create ap key."; 434 GoogleUpdateSettings::UpdateInstallStatus(false, 435 installer::INCREMENTAL_ARCHIVE_TYPE, 436 installer::FIRST_INSTALL_SUCCESS, 437 kTestProductGuid); 438 EXPECT_STREQ(ReadApKeyValue().c_str(), L""); 439 work_item_list->Rollback(); 440 441 work_item_list.reset(WorkItem::CreateWorkItemList()); 442 // Test full install failure 443 ASSERT_TRUE(CreateApKey(work_item_list.get(), L"-full")) 444 << "Failed to create ap key."; 445 GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE, 446 installer::INSTALL_FAILED, 447 kTestProductGuid); 448 EXPECT_STREQ(ReadApKeyValue().c_str(), L""); 449 work_item_list->Rollback(); 450 451 work_item_list.reset(WorkItem::CreateWorkItemList()); 452 // Test full install success 453 ASSERT_TRUE(CreateApKey(work_item_list.get(), L"-full")) 454 << "Failed to create ap key."; 455 GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE, 456 installer::FIRST_INSTALL_SUCCESS, 457 kTestProductGuid); 458 EXPECT_STREQ(ReadApKeyValue().c_str(), L""); 459 work_item_list->Rollback(); 460 461 work_item_list.reset(WorkItem::CreateWorkItemList()); 462 // Test the case of when "ap" key doesnt exist at all 463 std::wstring ap_key_value = ReadApKeyValue(); 464 std::wstring reg_key = GetApKeyPath(); 465 HKEY reg_root = HKEY_CURRENT_USER; 466 bool ap_key_deleted = false; 467 RegKey key; 468 if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) != 469 ERROR_SUCCESS) { 470 work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key); 471 ASSERT_TRUE(work_item_list->Do()) << "Failed to create ClientState key."; 472 } else if (key.DeleteValue(google_update::kRegApField) == ERROR_SUCCESS) { 473 ap_key_deleted = true; 474 } 475 // try differential installer 476 GoogleUpdateSettings::UpdateInstallStatus(false, 477 installer::INCREMENTAL_ARCHIVE_TYPE, 478 installer::INSTALL_FAILED, 479 kTestProductGuid); 480 EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full"); 481 // try full installer now 482 GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE, 483 installer::INSTALL_FAILED, 484 kTestProductGuid); 485 EXPECT_STREQ(ReadApKeyValue().c_str(), L""); 486 // Now cleanup to leave the system in unchanged state. 487 // - Diff installer creates an ap key if it didnt exist, so delete this ap key 488 // - If we created any reg key path for ap, roll it back 489 // - Finally restore the original value of ap key. 490 key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS); 491 key.DeleteValue(google_update::kRegApField); 492 work_item_list->Rollback(); 493 if (ap_key_deleted) { 494 work_item_list.reset(WorkItem::CreateWorkItemList()); 495 ASSERT_TRUE(CreateApKey(work_item_list.get(), ap_key_value)) 496 << "Failed to restore ap key."; 497 } 498} 499 500TEST_F(GoogleUpdateSettingsTest, SetEULAConsent) { 501 using installer::FakeInstallationState; 502 503 const bool multi_install = true; 504 const bool system_level = true; 505 FakeInstallationState machine_state; 506 507 // Chrome is installed. 508 machine_state.AddChrome(system_level, multi_install, 509 new Version(chrome::kChromeVersion)); 510 511 RegKey key; 512 DWORD value; 513 BrowserDistribution* binaries = 514 BrowserDistribution::GetSpecificDistribution( 515 BrowserDistribution::CHROME_BINARIES); 516 BrowserDistribution* chrome = 517 BrowserDistribution::GetSpecificDistribution( 518 BrowserDistribution::CHROME_BROWSER); 519 520 // eulaconsent is set on both the product and the binaries. 521 EXPECT_TRUE(GoogleUpdateSettings::SetEULAConsent(machine_state, chrome, 522 true)); 523 EXPECT_EQ(ERROR_SUCCESS, 524 key.Open(HKEY_LOCAL_MACHINE, binaries->GetStateMediumKey().c_str(), 525 KEY_QUERY_VALUE)); 526 EXPECT_EQ(ERROR_SUCCESS, 527 key.ReadValueDW(google_update::kRegEULAAceptedField, &value)); 528 EXPECT_EQ(1U, value); 529 EXPECT_EQ(ERROR_SUCCESS, 530 key.Open(HKEY_LOCAL_MACHINE, chrome->GetStateMediumKey().c_str(), 531 KEY_QUERY_VALUE)); 532 EXPECT_EQ(ERROR_SUCCESS, 533 key.ReadValueDW(google_update::kRegEULAAceptedField, &value)); 534 EXPECT_EQ(1U, value); 535} 536 537// Test that the appropriate default is returned if no update override is 538// present. 539TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyNoOverride) { 540 // There are no policies at all. 541 EXPECT_EQ(ERROR_FILE_NOT_FOUND, 542 RegKey().Open(HKEY_LOCAL_MACHINE, 543 GoogleUpdateSettings::kPoliciesKey, 544 KEY_QUERY_VALUE)); 545 bool is_overridden = true; 546 EXPECT_EQ(GoogleUpdateSettings::kDefaultUpdatePolicy, 547 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 548 &is_overridden)); 549 EXPECT_FALSE(is_overridden); 550 551 // The policy key exists, but there are no values of interest present. 552 EXPECT_EQ(ERROR_SUCCESS, 553 RegKey().Create(HKEY_LOCAL_MACHINE, 554 GoogleUpdateSettings::kPoliciesKey, 555 KEY_SET_VALUE)); 556 EXPECT_EQ(ERROR_SUCCESS, 557 RegKey().Open(HKEY_LOCAL_MACHINE, 558 GoogleUpdateSettings::kPoliciesKey, 559 KEY_QUERY_VALUE)); 560 is_overridden = true; 561 EXPECT_EQ(GoogleUpdateSettings::kDefaultUpdatePolicy, 562 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 563 &is_overridden)); 564 EXPECT_FALSE(is_overridden); 565} 566 567#if defined(GOOGLE_CHROME_BUILD) 568 569// Test that the default override is returned if no app-specific override is 570// present. 571TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyDefaultOverride) { 572 EXPECT_EQ(ERROR_SUCCESS, 573 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 574 KEY_SET_VALUE).WriteValue( 575 GoogleUpdateSettings::kUpdatePolicyValue, 576 static_cast<DWORD>(0))); 577 bool is_overridden = true; 578 EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED, 579 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 580 &is_overridden)); 581 EXPECT_FALSE(is_overridden); 582 583 EXPECT_EQ(ERROR_SUCCESS, 584 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 585 KEY_SET_VALUE).WriteValue( 586 GoogleUpdateSettings::kUpdatePolicyValue, 587 static_cast<DWORD>(1))); 588 is_overridden = true; 589 EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES, 590 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 591 &is_overridden)); 592 EXPECT_FALSE(is_overridden); 593 594 EXPECT_EQ(ERROR_SUCCESS, 595 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 596 KEY_SET_VALUE).WriteValue( 597 GoogleUpdateSettings::kUpdatePolicyValue, 598 static_cast<DWORD>(2))); 599 is_overridden = true; 600 EXPECT_EQ(GoogleUpdateSettings::MANUAL_UPDATES_ONLY, 601 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 602 &is_overridden)); 603 EXPECT_FALSE(is_overridden); 604 605 EXPECT_EQ(ERROR_SUCCESS, 606 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 607 KEY_SET_VALUE).WriteValue( 608 GoogleUpdateSettings::kUpdatePolicyValue, 609 static_cast<DWORD>(3))); 610 is_overridden = true; 611 EXPECT_EQ(GoogleUpdateSettings::AUTO_UPDATES_ONLY, 612 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 613 &is_overridden)); 614 EXPECT_FALSE(is_overridden); 615 616 // The default policy should be in force for bogus values. 617 EXPECT_EQ(ERROR_SUCCESS, 618 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 619 KEY_SET_VALUE).WriteValue( 620 GoogleUpdateSettings::kUpdatePolicyValue, 621 static_cast<DWORD>(4))); 622 is_overridden = true; 623 EXPECT_EQ(GoogleUpdateSettings::kDefaultUpdatePolicy, 624 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 625 &is_overridden)); 626 EXPECT_FALSE(is_overridden); 627} 628 629// Test that an app-specific override is used if present. 630TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyAppOverride) { 631 std::wstring app_policy_value( 632 GoogleUpdateSettings::kUpdateOverrideValuePrefix); 633 app_policy_value.append(kTestProductGuid); 634 635 EXPECT_EQ(ERROR_SUCCESS, 636 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 637 KEY_SET_VALUE).WriteValue( 638 GoogleUpdateSettings::kUpdatePolicyValue, 639 static_cast<DWORD>(1))); 640 EXPECT_EQ(ERROR_SUCCESS, 641 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 642 KEY_SET_VALUE).WriteValue(app_policy_value.c_str(), 643 static_cast<DWORD>(0))); 644 bool is_overridden = false; 645 EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED, 646 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 647 &is_overridden)); 648 EXPECT_TRUE(is_overridden); 649 650 EXPECT_EQ(ERROR_SUCCESS, 651 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 652 KEY_SET_VALUE).WriteValue( 653 GoogleUpdateSettings::kUpdatePolicyValue, 654 static_cast<DWORD>(0))); 655 EXPECT_EQ(ERROR_SUCCESS, 656 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 657 KEY_SET_VALUE).WriteValue(app_policy_value.c_str(), 658 static_cast<DWORD>(1))); 659 is_overridden = false; 660 EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES, 661 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 662 &is_overridden)); 663 EXPECT_TRUE(is_overridden); 664 665 EXPECT_EQ(ERROR_SUCCESS, 666 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 667 KEY_SET_VALUE).WriteValue(app_policy_value.c_str(), 668 static_cast<DWORD>(2))); 669 is_overridden = false; 670 EXPECT_EQ(GoogleUpdateSettings::MANUAL_UPDATES_ONLY, 671 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 672 &is_overridden)); 673 EXPECT_TRUE(is_overridden); 674 675 EXPECT_EQ(ERROR_SUCCESS, 676 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 677 KEY_SET_VALUE).WriteValue(app_policy_value.c_str(), 678 static_cast<DWORD>(3))); 679 is_overridden = false; 680 EXPECT_EQ(GoogleUpdateSettings::AUTO_UPDATES_ONLY, 681 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 682 &is_overridden)); 683 EXPECT_TRUE(is_overridden); 684 685 // The default policy should be in force for bogus values. 686 EXPECT_EQ(ERROR_SUCCESS, 687 RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey, 688 KEY_SET_VALUE).WriteValue(app_policy_value.c_str(), 689 static_cast<DWORD>(4))); 690 is_overridden = true; 691 EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED, 692 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 693 &is_overridden)); 694 EXPECT_FALSE(is_overridden); 695} 696 697TEST_F(GoogleUpdateSettingsTest, PerAppUpdatesDisabledByPolicy) { 698 EXPECT_TRUE( 699 SetUpdatePolicyForAppGuid(kTestProductGuid, 700 GoogleUpdateSettings::UPDATES_DISABLED)); 701 bool is_overridden = false; 702 GoogleUpdateSettings::UpdatePolicy update_policy = 703 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 704 &is_overridden); 705 EXPECT_TRUE(is_overridden); 706 EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED, update_policy); 707 EXPECT_FALSE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 708 709 EXPECT_TRUE( 710 GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid)); 711 update_policy = GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 712 &is_overridden); 713 // Should still have a policy but now that policy should explicitly enable 714 // updates. 715 EXPECT_TRUE(is_overridden); 716 EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES, update_policy); 717 EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 718} 719 720TEST_F(GoogleUpdateSettingsTest, PerAppUpdatesEnabledWithGlobalDisabled) { 721 // Disable updates globally but enable them for our specific app (the app- 722 // specific setting should take precedence). 723 EXPECT_TRUE( 724 SetUpdatePolicyForAppGuid(kTestProductGuid, 725 GoogleUpdateSettings::AUTOMATIC_UPDATES)); 726 EXPECT_TRUE(SetGlobalUpdatePolicy(GoogleUpdateSettings::UPDATES_DISABLED)); 727 728 // Make sure we read this as still having updates enabled. 729 EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 730 731 // Make sure that the reset action returns true and is a no-op. 732 EXPECT_TRUE( 733 GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid)); 734 EXPECT_EQ(static_cast<DWORD>(GoogleUpdateSettings::AUTOMATIC_UPDATES), 735 GetUpdatePolicyForAppGuid(kTestProductGuid)); 736 EXPECT_EQ(static_cast<DWORD>(GoogleUpdateSettings::UPDATES_DISABLED), 737 GetGlobalUpdatePolicy()); 738} 739 740TEST_F(GoogleUpdateSettingsTest, GlobalUpdatesDisabledByPolicy) { 741 EXPECT_TRUE(SetGlobalUpdatePolicy(GoogleUpdateSettings::UPDATES_DISABLED)); 742 bool is_overridden = false; 743 744 // The contract for GetAppUpdatePolicy states that |is_overridden| should be 745 // set to false when updates are disabled on a non-app-specific basis. 746 GoogleUpdateSettings::UpdatePolicy update_policy = 747 GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 748 &is_overridden); 749 EXPECT_FALSE(is_overridden); 750 EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED, update_policy); 751 EXPECT_FALSE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 752 753 EXPECT_TRUE( 754 GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid)); 755 update_policy = GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid, 756 &is_overridden); 757 // Policy should now be to enable updates, |is_overridden| should still be 758 // false. 759 EXPECT_FALSE(is_overridden); 760 EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES, update_policy); 761 EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 762} 763 764TEST_F(GoogleUpdateSettingsTest, UpdatesDisabledByTimeout) { 765 // Disable updates altogether. 766 EXPECT_TRUE(SetUpdateTimeoutOverride(0)); 767 EXPECT_FALSE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 768 EXPECT_TRUE( 769 GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid)); 770 EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 771 772 // Set the update period to something unreasonable. 773 EXPECT_TRUE(SetUpdateTimeoutOverride( 774 GoogleUpdateSettings::kCheckPeriodOverrideMinutesMax + 1)); 775 EXPECT_FALSE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 776 EXPECT_TRUE( 777 GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid)); 778 EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid)); 779} 780 781TEST_F(GoogleUpdateSettingsTest, ExperimentsLabelHelperSystem) { 782 TestExperimentsLabelHelper(SYSTEM_INSTALL); 783} 784 785TEST_F(GoogleUpdateSettingsTest, ExperimentsLabelHelperUser) { 786 TestExperimentsLabelHelper(USER_INSTALL); 787} 788 789#endif // defined(GOOGLE_CHROME_BUILD) 790 791// Test GoogleUpdateSettings::GetUninstallCommandLine at system- or user-level, 792// according to the param. 793class GetUninstallCommandLine : public GoogleUpdateSettingsTest, 794 public testing::WithParamInterface<bool> { 795 protected: 796 static const wchar_t kDummyCommand[]; 797 798 virtual void SetUp() OVERRIDE { 799 GoogleUpdateSettingsTest::SetUp(); 800 system_install_ = GetParam(); 801 root_key_ = system_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 802 } 803 804 HKEY root_key_; 805 bool system_install_; 806}; 807 808const wchar_t GetUninstallCommandLine::kDummyCommand[] = 809 L"\"goopdate.exe\" /spam"; 810 811// Tests that GetUninstallCommandLine returns an empty string if there's no 812// Software\Google\Update key. 813TEST_P(GetUninstallCommandLine, TestNoKey) { 814 EXPECT_EQ(base::string16(), 815 GoogleUpdateSettings::GetUninstallCommandLine(system_install_)); 816} 817 818// Tests that GetUninstallCommandLine returns an empty string if there's no 819// UninstallCmdLine value in the Software\Google\Update key. 820TEST_P(GetUninstallCommandLine, TestNoValue) { 821 RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE); 822 EXPECT_EQ(base::string16(), 823 GoogleUpdateSettings::GetUninstallCommandLine(system_install_)); 824} 825 826// Tests that GetUninstallCommandLine returns an empty string if there's an 827// empty UninstallCmdLine value in the Software\Google\Update key. 828TEST_P(GetUninstallCommandLine, TestEmptyValue) { 829 RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE) 830 .WriteValue(google_update::kRegUninstallCmdLine, L""); 831 EXPECT_EQ(base::string16(), 832 GoogleUpdateSettings::GetUninstallCommandLine(system_install_)); 833} 834 835// Tests that GetUninstallCommandLine returns the correct string if there's an 836// UninstallCmdLine value in the Software\Google\Update key. 837TEST_P(GetUninstallCommandLine, TestRealValue) { 838 RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE) 839 .WriteValue(google_update::kRegUninstallCmdLine, kDummyCommand); 840 EXPECT_EQ(base::string16(kDummyCommand), 841 GoogleUpdateSettings::GetUninstallCommandLine(system_install_)); 842 // Make sure that there's no value in the other level (user or system). 843 EXPECT_EQ(base::string16(), 844 GoogleUpdateSettings::GetUninstallCommandLine(!system_install_)); 845} 846 847INSTANTIATE_TEST_CASE_P(GetUninstallCommandLineAtLevel, GetUninstallCommandLine, 848 testing::Bool()); 849 850// Test GoogleUpdateSettings::GetGoogleUpdateVersion at system- or user-level, 851// according to the param. 852class GetGoogleUpdateVersion : public GoogleUpdateSettingsTest, 853 public testing::WithParamInterface<bool> { 854 protected: 855 static const wchar_t kDummyVersion[]; 856 857 virtual void SetUp() OVERRIDE { 858 GoogleUpdateSettingsTest::SetUp(); 859 system_install_ = GetParam(); 860 root_key_ = system_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 861 } 862 863 HKEY root_key_; 864 bool system_install_; 865}; 866 867const wchar_t GetGoogleUpdateVersion::kDummyVersion[] = L"1.2.3.4"; 868 869// Tests that GetGoogleUpdateVersion returns an empty string if there's no 870// Software\Google\Update key. 871TEST_P(GetGoogleUpdateVersion, TestNoKey) { 872 EXPECT_FALSE( 873 GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid()); 874} 875 876// Tests that GetGoogleUpdateVersion returns an empty string if there's no 877// version value in the Software\Google\Update key. 878TEST_P(GetGoogleUpdateVersion, TestNoValue) { 879 RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE); 880 EXPECT_FALSE( 881 GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid()); 882} 883 884// Tests that GetGoogleUpdateVersion returns an empty string if there's an 885// empty version value in the Software\Google\Update key. 886TEST_P(GetGoogleUpdateVersion, TestEmptyValue) { 887 RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE) 888 .WriteValue(google_update::kRegGoogleUpdateVersion, L""); 889 EXPECT_FALSE( 890 GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid()); 891} 892 893// Tests that GetGoogleUpdateVersion returns the correct string if there's a 894// version value in the Software\Google\Update key. 895TEST_P(GetGoogleUpdateVersion, TestRealValue) { 896 RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE) 897 .WriteValue(google_update::kRegGoogleUpdateVersion, kDummyVersion); 898 Version expected(base::UTF16ToUTF8(kDummyVersion)); 899 EXPECT_TRUE(expected.Equals( 900 GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_))); 901 // Make sure that there's no value in the other level (user or system). 902 EXPECT_FALSE( 903 GoogleUpdateSettings::GetGoogleUpdateVersion(!system_install_) 904 .IsValid()); 905} 906 907INSTANTIATE_TEST_CASE_P(GetGoogleUpdateVersionAtLevel, GetGoogleUpdateVersion, 908 testing::Bool()); 909 910// Test values for use by the CollectStatsConsent test fixture. 911class StatsState { 912 public: 913 enum InstallType { 914 SINGLE_INSTALL, 915 MULTI_INSTALL, 916 }; 917 enum StateSetting { 918 NO_SETTING, 919 FALSE_SETTING, 920 TRUE_SETTING, 921 }; 922 struct UserLevelState {}; 923 struct SystemLevelState {}; 924 static const UserLevelState kUserLevel; 925 static const SystemLevelState kSystemLevel; 926 927 StatsState(const UserLevelState&, 928 InstallType install_type, 929 StateSetting state_value) 930 : system_level_(false), 931 multi_install_(install_type == MULTI_INSTALL), 932 state_value_(state_value), 933 state_medium_value_(NO_SETTING) { 934 } 935 StatsState(const SystemLevelState&, 936 InstallType install_type, 937 StateSetting state_value, 938 StateSetting state_medium_value) 939 : system_level_(true), 940 multi_install_(install_type == MULTI_INSTALL), 941 state_value_(state_value), 942 state_medium_value_(state_medium_value) { 943 } 944 bool system_level() const { return system_level_; } 945 bool multi_install() const { return multi_install_; } 946 HKEY root_key() const { 947 return system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 948 } 949 StateSetting state_value() const { return state_value_; } 950 StateSetting state_medium_value() const { 951 return state_medium_value_; 952 } 953 bool is_consent_granted() const { 954 return (system_level_ && state_medium_value_ != NO_SETTING) ? 955 (state_medium_value_ == TRUE_SETTING) : 956 (state_value_ == TRUE_SETTING); 957 } 958 959 private: 960 bool system_level_; 961 bool multi_install_; 962 StateSetting state_value_; 963 StateSetting state_medium_value_; 964}; 965 966const StatsState::UserLevelState StatsState::kUserLevel; 967const StatsState::SystemLevelState StatsState::kSystemLevel; 968 969// A value parameterized test for testing the stats collection consent setting. 970class CollectStatsConsent : public ::testing::TestWithParam<StatsState> { 971 public: 972 static void SetUpTestCase(); 973 static void TearDownTestCase(); 974 protected: 975 virtual void SetUp() OVERRIDE; 976 static void MakeChromeMultiInstall(HKEY root_key); 977 static void ApplySetting(StatsState::StateSetting setting, 978 HKEY root_key, 979 const std::wstring& reg_key); 980 981 static std::wstring* chrome_version_key_; 982 static std::wstring* chrome_state_key_; 983 static std::wstring* chrome_state_medium_key_; 984 static std::wstring* binaries_state_key_; 985 static std::wstring* binaries_state_medium_key_; 986 registry_util::RegistryOverrideManager override_manager_; 987}; 988 989std::wstring* CollectStatsConsent::chrome_version_key_; 990std::wstring* CollectStatsConsent::chrome_state_key_; 991std::wstring* CollectStatsConsent::chrome_state_medium_key_; 992std::wstring* CollectStatsConsent::binaries_state_key_; 993std::wstring* CollectStatsConsent::binaries_state_medium_key_; 994 995void CollectStatsConsent::SetUpTestCase() { 996 BrowserDistribution* dist = 997 BrowserDistribution::GetSpecificDistribution( 998 BrowserDistribution::CHROME_BROWSER); 999 chrome_version_key_ = new std::wstring(dist->GetVersionKey()); 1000 chrome_state_key_ = new std::wstring(dist->GetStateKey()); 1001 chrome_state_medium_key_ = new std::wstring(dist->GetStateMediumKey()); 1002 1003 dist = BrowserDistribution::GetSpecificDistribution( 1004 BrowserDistribution::CHROME_BINARIES); 1005 binaries_state_key_ = new std::wstring(dist->GetStateKey()); 1006 binaries_state_medium_key_ = new std::wstring(dist->GetStateMediumKey()); 1007} 1008 1009void CollectStatsConsent::TearDownTestCase() { 1010 delete chrome_version_key_; 1011 delete chrome_state_key_; 1012 delete chrome_state_medium_key_; 1013 delete binaries_state_key_; 1014 delete binaries_state_medium_key_; 1015} 1016 1017// Install the registry override and apply the settings to the registry. 1018void CollectStatsConsent::SetUp() { 1019 const StatsState& stats_state = GetParam(); 1020 const HKEY root_key = stats_state.root_key(); 1021 std::wstring reg_temp_name(stats_state.system_level() ? L"HKLM_" : L"HKCU_"); 1022 reg_temp_name += L"CollectStatsConsent"; 1023 override_manager_.OverrideRegistry(root_key, reg_temp_name); 1024 1025 if (stats_state.multi_install()) { 1026 MakeChromeMultiInstall(root_key); 1027 ApplySetting(stats_state.state_value(), root_key, *binaries_state_key_); 1028 ApplySetting(stats_state.state_medium_value(), root_key, 1029 *binaries_state_medium_key_); 1030 } else { 1031 ApplySetting(stats_state.state_value(), root_key, *chrome_state_key_); 1032 ApplySetting(stats_state.state_medium_value(), root_key, 1033 *chrome_state_medium_key_); 1034 } 1035} 1036 1037// Write values into the registry so that Chrome is considered to be installed 1038// as multi-install. 1039void CollectStatsConsent::MakeChromeMultiInstall(HKEY root_key) { 1040 ASSERT_EQ( 1041 ERROR_SUCCESS, 1042 RegKey(root_key, chrome_version_key_->c_str(), 1043 KEY_SET_VALUE).WriteValue(google_update::kRegVersionField, 1044 L"1.2.3.4")); 1045 ASSERT_EQ( 1046 ERROR_SUCCESS, 1047 RegKey(root_key, chrome_state_key_->c_str(), 1048 KEY_SET_VALUE).WriteValue(installer::kUninstallArgumentsField, 1049 L"--multi-install")); 1050} 1051 1052// Write the correct value to represent |setting| in the registry. 1053void CollectStatsConsent::ApplySetting(StatsState::StateSetting setting, 1054 HKEY root_key, 1055 const std::wstring& reg_key) { 1056 if (setting != StatsState::NO_SETTING) { 1057 DWORD value = setting != StatsState::FALSE_SETTING ? 1 : 0; 1058 ASSERT_EQ( 1059 ERROR_SUCCESS, 1060 RegKey(root_key, reg_key.c_str(), 1061 KEY_SET_VALUE).WriteValue(google_update::kRegUsageStatsField, 1062 value)); 1063 } 1064} 1065 1066// Test that stats consent can be read. 1067TEST_P(CollectStatsConsent, GetCollectStatsConsentAtLevel) { 1068 if (GetParam().is_consent_granted()) { 1069 EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel( 1070 GetParam().system_level())); 1071 } else { 1072 EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel( 1073 GetParam().system_level())); 1074 } 1075} 1076 1077// Test that stats consent can be flipped to the opposite setting, that the new 1078// setting takes affect, and that the correct registry location is modified. 1079TEST_P(CollectStatsConsent, SetCollectStatsConsentAtLevel) { 1080 EXPECT_TRUE(GoogleUpdateSettings::SetCollectStatsConsentAtLevel( 1081 GetParam().system_level(), 1082 !GetParam().is_consent_granted())); 1083 const std::wstring* const reg_keys[] = { 1084 chrome_state_key_, 1085 chrome_state_medium_key_, 1086 binaries_state_key_, 1087 binaries_state_medium_key_, 1088 }; 1089 int key_index = ((GetParam().system_level() ? 1 : 0) + 1090 (GetParam().multi_install() ? 2 : 0)); 1091 const std::wstring& reg_key = *reg_keys[key_index]; 1092 DWORD value = 0; 1093 EXPECT_EQ( 1094 ERROR_SUCCESS, 1095 RegKey(GetParam().root_key(), reg_key.c_str(), 1096 KEY_QUERY_VALUE).ReadValueDW(google_update::kRegUsageStatsField, 1097 &value)); 1098 if (GetParam().is_consent_granted()) { 1099 EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel( 1100 GetParam().system_level())); 1101 EXPECT_EQ(0UL, value); 1102 } else { 1103 EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel( 1104 GetParam().system_level())); 1105 EXPECT_EQ(1UL, value); 1106 } 1107} 1108 1109INSTANTIATE_TEST_CASE_P( 1110 UserLevelSingleInstall, 1111 CollectStatsConsent, 1112 ::testing::Values( 1113 StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL, 1114 StatsState::NO_SETTING), 1115 StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL, 1116 StatsState::FALSE_SETTING), 1117 StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL, 1118 StatsState::TRUE_SETTING))); 1119INSTANTIATE_TEST_CASE_P( 1120 UserLevelMultiInstall, 1121 CollectStatsConsent, 1122 ::testing::Values( 1123 StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL, 1124 StatsState::NO_SETTING), 1125 StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL, 1126 StatsState::FALSE_SETTING), 1127 StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL, 1128 StatsState::TRUE_SETTING))); 1129INSTANTIATE_TEST_CASE_P( 1130 SystemLevelSingleInstall, 1131 CollectStatsConsent, 1132 ::testing::Values( 1133 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1134 StatsState::NO_SETTING, StatsState::NO_SETTING), 1135 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1136 StatsState::NO_SETTING, StatsState::FALSE_SETTING), 1137 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1138 StatsState::NO_SETTING, StatsState::TRUE_SETTING), 1139 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1140 StatsState::FALSE_SETTING, StatsState::NO_SETTING), 1141 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1142 StatsState::FALSE_SETTING, StatsState::FALSE_SETTING), 1143 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1144 StatsState::FALSE_SETTING, StatsState::TRUE_SETTING), 1145 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1146 StatsState::TRUE_SETTING, StatsState::NO_SETTING), 1147 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1148 StatsState::TRUE_SETTING, StatsState::FALSE_SETTING), 1149 StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL, 1150 StatsState::TRUE_SETTING, StatsState::TRUE_SETTING))); 1151INSTANTIATE_TEST_CASE_P( 1152 SystemLevelMultiInstall, 1153 CollectStatsConsent, 1154 ::testing::Values( 1155 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1156 StatsState::NO_SETTING, StatsState::NO_SETTING), 1157 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1158 StatsState::NO_SETTING, StatsState::FALSE_SETTING), 1159 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1160 StatsState::NO_SETTING, StatsState::TRUE_SETTING), 1161 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1162 StatsState::FALSE_SETTING, StatsState::NO_SETTING), 1163 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1164 StatsState::FALSE_SETTING, StatsState::FALSE_SETTING), 1165 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1166 StatsState::FALSE_SETTING, StatsState::TRUE_SETTING), 1167 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1168 StatsState::TRUE_SETTING, StatsState::NO_SETTING), 1169 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1170 StatsState::TRUE_SETTING, StatsState::FALSE_SETTING), 1171 StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL, 1172 StatsState::TRUE_SETTING, StatsState::TRUE_SETTING))); 1173