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