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