google_update_settings_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shlwapi.h>  // For SHDeleteKey.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_reg_util_win.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/browser_distribution.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/channel_info.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/fake_installation_state.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_constants.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/installer/util/google_update_experiment_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_settings.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/util_constants.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/work_item_list.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using installer::ChannelInfo;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kGoogleUpdatePoliciesKey[] =
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"SOFTWARE\\Policies\\Google\\Update";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kGoogleUpdateUpdateDefault[] = L"UpdateDefault";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kGoogleUpdateUpdatePrefix[] = L"Update";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GoogleUpdateSettings::UpdatePolicy kDefaultUpdatePolicy =
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoogleUpdateSettings::AUTOMATIC_UPDATES;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoogleUpdateSettings::UPDATES_DISABLED;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kTestProductGuid[] = L"{89F1B351-B15D-48D4-8F10-1298721CF13D}";
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const wchar_t kTestExperimentLabel[] = L"test_label_value";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test fixture redirects the HKLM and HKCU registry hives for
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the duration of the test to make it independent of the machine
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and user settings.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GoogleUpdateSettingsTest : public testing::Test {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_overrides_.OverrideRegistry(HKEY_LOCAL_MACHINE, L"HKLM_pit");
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_overrides_.OverrideRegistry(HKEY_CURRENT_USER, L"HKCU_pit");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum SystemUserInstall {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SYSTEM_INSTALL,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    USER_INSTALL,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetApField(SystemUserInstall is_system, const wchar_t* value) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HKEY root = is_system == SYSTEM_INSTALL ?
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey update_key;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserDistribution* dist = BrowserDistribution::GetDistribution();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring path = dist->GetStateKey();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ERROR_SUCCESS, update_key.Create(root, path.c_str(), KEY_WRITE));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ERROR_SUCCESS, update_key.WriteValue(L"ap", value));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests setting the ap= value to various combinations of values with
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefixes and suffixes, while asserting on the correct channel value.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that any non-empty ap= value that doesn't match ".*-{dev|beta}.*"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will return the "unknown" channel.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestCurrentChromeChannelWithVariousApValues(SystemUserInstall install) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static struct Expectations {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const wchar_t* ap_value;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const wchar_t* channel;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } expectations[] = {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"dev", installer::kChromeChannelDev },
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"-dev", installer::kChromeChannelDev },
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"-developer", installer::kChromeChannelDev },
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"beta", installer::kChromeChannelBeta },
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"-beta", installer::kChromeChannelBeta },
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"-betamax", installer::kChromeChannelBeta },
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_system = install == SYSTEM_INSTALL;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* prefixes[] = {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"",
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"prefix",
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"prefix-with-dash",
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* suffixes[] = {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"",
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"suffix",
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"suffix-with-dash",
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < arraysize(prefixes); ++i) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t j = 0; j < arraysize(expectations); ++j) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (size_t k = 0; k < arraysize(suffixes); ++k) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          std::wstring ap = prefixes[i];
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ap += expectations[j].ap_value;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ap += suffixes[k];
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const wchar_t* channel = expectations[j].channel;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SetApField(install, ap.c_str());
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::string16 ret_channel;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              is_system, &ret_channel));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_STREQ(channel, ret_channel.c_str())
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << "Expecting channel \"" << channel
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << "\" for ap=\"" << ap << "\"";
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test the writing and deleting functionality of the experiments label
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // helper.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TestExperimentsLabelHelper(SystemUserInstall install) {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserDistribution* chrome =
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserDistribution::GetSpecificDistribution(
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            BrowserDistribution::CHROME_BROWSER);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::wstring value;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(chrome->ShouldSetExperimentLabels());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Before anything is set, ReadExperimentLabels should succeed but return
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // an empty string.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, &value));
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::string16(), value);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::SetExperimentLabels(
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, kTestExperimentLabel));
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Validate that something is written. Only worry about the label itself.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RegKey key;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HKEY root = install == SYSTEM_INSTALL ?
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 state_key = install == SYSTEM_INSTALL ?
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome->GetStateMediumKey() : chrome->GetStateKey();
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              key.Open(root, state_key.c_str(), KEY_QUERY_VALUE));
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        key.ReadValue(google_update::kExperimentLabels, &value));
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kTestExperimentLabel, value);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, &value));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kTestExperimentLabel, value);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    key.Close();
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Now that the label is set, test the delete functionality. An empty label
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // should result in deleting the value.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::SetExperimentLabels(
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        install == SYSTEM_INSTALL, base::string16()));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              key.Open(root, state_key.c_str(), KEY_QUERY_VALUE));
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERROR_FILE_NOT_FOUND,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        key.ReadValue(google_update::kExperimentLabels, &value));
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, &value));
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::string16(), value);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    key.Close();
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(chrome->ShouldSetExperimentLabels());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(GoogleUpdateSettings::ReadExperimentLabels(
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, &value));
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // GOOGLE_CHROME_BUILD
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates "ap" key with the value given as parameter. Also adds work
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // items to work_item_list given so that they can be rolled back later.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateApKey(WorkItemList* work_item_list, const std::wstring& value) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HKEY reg_root = HKEY_CURRENT_USER;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring reg_key = GetApKeyPath();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    work_item_list->AddSetRegValueWorkItem(reg_root, reg_key,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        google_update::kRegApField, value.c_str(), true);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!work_item_list->Do()) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      work_item_list->Rollback();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the key path of "ap" key, e.g.:
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Google\Update\ClientState\<kTestProductGuid>
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring GetApKeyPath() {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring reg_key(google_update::kRegPathClientState);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reg_key.append(L"\\");
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reg_key.append(kTestProductGuid);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reg_key;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Utility method to read "ap" key value
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring ReadApKeyValue() {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey key;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring ap_key_value;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring reg_key = GetApKeyPath();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) ==
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ERROR_SUCCESS) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.ReadValue(google_update::kRegApField, &ap_key_value);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ap_key_value;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_util::RegistryOverrideManager registry_overrides_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we return success on no registration (which means stable),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether per-system or per-user install.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelAbsent) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per-system first.
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 channel;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then per-user.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test an empty Ap key for system and user.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelEmptySystem) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetApField(SYSTEM_INSTALL, L"");
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 channel;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per-user lookups still succeed and return empty string.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelEmptyUser) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetApField(USER_INSTALL, L"");
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per-system lookups still succeed and return empty string.
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 channel;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per-user lookup should succeed.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelVariousApValuesSystem) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCurrentChromeChannelWithVariousApValues(SYSTEM_INSTALL);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelVariousApValuesUser) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCurrentChromeChannelWithVariousApValues(USER_INSTALL);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Run through all combinations of diff vs. full install, single vs. multi
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// install, success and failure results, and a fistful of initial "ap" values
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// checking that the expected final "ap" value is generated by
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GoogleUpdateSettings::UpdateGoogleUpdateApKey.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, UpdateGoogleUpdateApKey) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const installer::ArchiveType archive_types[] = {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::UNKNOWN_ARCHIVE_TYPE,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::FULL_ARCHIVE_TYPE,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::INCREMENTAL_ARCHIVE_TYPE
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int results[] = {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::FIRST_INSTALL_SUCCESS,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::INSTALL_FAILED
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const plain[] = {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1",
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-dev"
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const full[] = {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"-full",
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-full",
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-dev-full"
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(full) == arraysize(plain), bad_full_array_size);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const multifail[] = {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"-multifail",
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-multifail",
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-dev-multifail"
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(multifail) == arraysize(plain),
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 bad_multifail_array_size);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const multifail_full[] = {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"-multifail-full",
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-multifail-full",
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-dev-multifail-full"
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(multifail_full) == arraysize(plain),
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 bad_multifail_full_array_size);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const* input_arrays[] = {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plain,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    multifail,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    multifail_full
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChannelInfo v;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int type_idx = 0; type_idx < arraysize(archive_types); ++type_idx) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const installer::ArchiveType archive_type = archive_types[type_idx];
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int result_idx = 0; result_idx < arraysize(results); ++result_idx) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const int result = results[result_idx];
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The archive type will/must always be known on install success.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (archive_type == installer::UNKNOWN_ARCHIVE_TYPE &&
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          result == installer::FIRST_INSTALL_SUCCESS) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const wchar_t* const* outputs = NULL;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (result == installer::FIRST_INSTALL_SUCCESS ||
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          archive_type == installer::FULL_ARCHIVE_TYPE) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        outputs = plain;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (archive_type == installer::INCREMENTAL_ARCHIVE_TYPE) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        outputs = full;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }  // else if (archive_type == UNKNOWN) see below
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int inputs_idx = 0; inputs_idx < arraysize(input_arrays);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ++inputs_idx) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const wchar_t* const* inputs = input_arrays[inputs_idx];
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (archive_type == installer::UNKNOWN_ARCHIVE_TYPE) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // "-full" is untouched if the archive type is unknown.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // "-multifail" is unconditionally removed.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (inputs == full || inputs == multifail_full)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            outputs = full;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            outputs = plain;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int input_idx = 0; input_idx < arraysize(plain); ++input_idx) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const wchar_t* input = inputs[input_idx];
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const wchar_t* output = outputs[input_idx];
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v.set_value(input);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (output == v.value()) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EXPECT_FALSE(GoogleUpdateSettings::UpdateGoogleUpdateApKey(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                archive_type, result, &v))
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << "archive_type: " << archive_type
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << ", result: " << result
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << ", input ap value: " << input;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EXPECT_TRUE(GoogleUpdateSettings::UpdateGoogleUpdateApKey(
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                archive_type, result, &v))
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << "archive_type: " << archive_type
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << ", result: " << result
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << ", input ap value: " << input;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_EQ(output, v.value())
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << "archive_type: " << archive_type
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", result: " << result
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", input ap value: " << input;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, UpdateInstallStatusTest) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test incremental install failure
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateApKey(work_item_list.get(), L""))
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed to create ap key.";
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INCREMENTAL_ARCHIVE_TYPE,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INSTALL_FAILED,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full");
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list.reset(WorkItem::CreateWorkItemList());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test incremental install success
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateApKey(work_item_list.get(), L""))
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed to create ap key.";
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INCREMENTAL_ARCHIVE_TYPE,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::FIRST_INSTALL_SUCCESS,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list.reset(WorkItem::CreateWorkItemList());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test full install failure
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateApKey(work_item_list.get(), L"-full"))
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed to create ap key.";
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INSTALL_FAILED,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list.reset(WorkItem::CreateWorkItemList());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test full install success
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateApKey(work_item_list.get(), L"-full"))
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed to create ap key.";
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::FIRST_INSTALL_SUCCESS,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list.reset(WorkItem::CreateWorkItemList());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test the case of when "ap" key doesnt exist at all
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring ap_key_value = ReadApKeyValue();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring reg_key = GetApKeyPath();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY reg_root = HKEY_CURRENT_USER;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ap_key_deleted = false;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) !=
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ERROR_SUCCESS) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    work_item_list->AddCreateRegKeyWorkItem(reg_root, reg_key);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(work_item_list->Do()) << "Failed to create ClientState key.";
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (key.DeleteValue(google_update::kRegApField) == ERROR_SUCCESS) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ap_key_deleted = true;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try differential installer
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INCREMENTAL_ARCHIVE_TYPE,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INSTALL_FAILED,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full");
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try full installer now
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INSTALL_FAILED,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now cleanup to leave the system in unchanged state.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - Diff installer creates an ap key if it didnt exist, so delete this ap key
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - If we created any reg key path for ap, roll it back
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - Finally restore the original value of ap key.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key.DeleteValue(google_update::kRegApField);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ap_key_deleted) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    work_item_list.reset(WorkItem::CreateWorkItemList());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(CreateApKey(work_item_list.get(), ap_key_value))
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Failed to restore ap key.";
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, SetEULAConsent) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using installer::FakeInstallationState;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool multi_install = true;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool system_level = true;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeInstallationState machine_state;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Chrome is installed.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  machine_state.AddChrome(system_level, multi_install,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new Version(chrome::kChromeVersion));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD value;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserDistribution* binaries =
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::GetSpecificDistribution(
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserDistribution::CHROME_BINARIES);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserDistribution* chrome =
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::GetSpecificDistribution(
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserDistribution::CHROME_BROWSER);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // eulaconsent is set on both the product and the binaries.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::SetEULAConsent(machine_state, chrome,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   true));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_LOCAL_MACHINE, binaries->GetStateMediumKey().c_str(),
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               KEY_QUERY_VALUE));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.ReadValueDW(google_update::kRegEULAAceptedField, &value));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, value);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_LOCAL_MACHINE, chrome->GetStateMediumKey().c_str(),
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               KEY_QUERY_VALUE));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.ReadValueDW(google_update::kRegEULAAceptedField, &value));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, value);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the appropriate default is returned if no update override is
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// present.
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyNoOverride) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There are no policies at all.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_FILE_NOT_FOUND,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey().Open(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_overridden = true;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kDefaultUpdatePolicy,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The policy key exists, but there are no values of interest present.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey().Create(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            KEY_SET_VALUE));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey().Open(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kDefaultUpdatePolicy,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the default override is returned if no app-specific override is
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// present.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyDefaultOverride) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(kGoogleUpdateUpdateDefault,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(0)));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_overridden = true;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(kGoogleUpdateUpdateDefault,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(1)));
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(kGoogleUpdateUpdateDefault,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(2)));
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::MANUAL_UPDATES_ONLY,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(kGoogleUpdateUpdateDefault,
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(3)));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::AUTO_UPDATES_ONLY,
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                     &is_overridden));
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(is_overridden);
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The default policy should be in force for bogus values.
559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ERROR_SUCCESS,
560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   KEY_SET_VALUE).WriteValue(kGoogleUpdateUpdateDefault,
562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             static_cast<DWORD>(4)));
563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  is_overridden = true;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kDefaultUpdatePolicy,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an app-specific override is used if present.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyAppOverride) {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring app_policy_value(kGoogleUpdateUpdatePrefix);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_policy_value.append(kTestProductGuid);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(kGoogleUpdateUpdateDefault,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(1)));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(0)));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_overridden = false;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_overridden);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(kGoogleUpdateUpdateDefault,
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(0)));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(1)));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = false;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_overridden);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(2)));
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = false;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::MANUAL_UPDATES_ONLY,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_overridden);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(3)));
617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  is_overridden = false;
618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::AUTO_UPDATES_ONLY,
619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                     &is_overridden));
621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(is_overridden);
622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The default policy should be in force for bogus values.
624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ERROR_SUCCESS,
625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             static_cast<DWORD>(4)));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, ExperimentsLabelHelperSystem) {
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestExperimentsLabelHelper(SYSTEM_INSTALL);
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, ExperimentsLabelHelperUser) {
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestExperimentsLabelHelper(USER_INSTALL);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(GOOGLE_CHROME_BUILD)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test GoogleUpdateSettings::GetUninstallCommandLine at system- or user-level,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// according to the param.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetUninstallCommandLine : public GoogleUpdateSettingsTest,
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                public testing::WithParamInterface<bool> {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kDummyCommand[];
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoogleUpdateSettingsTest::SetUp();
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system_install_ = GetParam();
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_key_ = system_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY root_key_;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool system_install_;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t GetUninstallCommandLine::kDummyCommand[] =
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"\"goopdate.exe\" /spam";
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetUninstallCommandLine returns an empty string if there's no
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Software\Google\Update key.
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetUninstallCommandLine, TestNoKey) {
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(),
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(system_install_));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetUninstallCommandLine returns an empty string if there's no
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UninstallCmdLine value in the Software\Google\Update key.
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetUninstallCommandLine, TestNoValue) {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE);
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(),
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(system_install_));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetUninstallCommandLine returns an empty string if there's an
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// empty UninstallCmdLine value in the Software\Google\Update key.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetUninstallCommandLine, TestEmptyValue) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WriteValue(google_update::kRegUninstallCmdLine, L"");
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(),
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(system_install_));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetUninstallCommandLine returns the correct string if there's an
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UninstallCmdLine value in the Software\Google\Update key.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetUninstallCommandLine, TestRealValue) {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WriteValue(google_update::kRegUninstallCmdLine, kDummyCommand);
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(kDummyCommand),
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(system_install_));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that there's no value in the other level (user or system).
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(),
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(!system_install_));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(GetUninstallCommandLineAtLevel, GetUninstallCommandLine,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        testing::Bool());
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test GoogleUpdateSettings::GetGoogleUpdateVersion at system- or user-level,
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// according to the param.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetGoogleUpdateVersion : public GoogleUpdateSettingsTest,
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               public testing::WithParamInterface<bool> {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kDummyVersion[];
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoogleUpdateSettingsTest::SetUp();
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system_install_ = GetParam();
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_key_ = system_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY root_key_;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool system_install_;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t GetGoogleUpdateVersion::kDummyVersion[] = L"1.2.3.4";
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetGoogleUpdateVersion returns an empty string if there's no
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Software\Google\Update key.
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetGoogleUpdateVersion, TestNoKey) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid());
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetGoogleUpdateVersion returns an empty string if there's no
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version value in the Software\Google\Update key.
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetGoogleUpdateVersion, TestNoValue) {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid());
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetGoogleUpdateVersion returns an empty string if there's an
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// empty version value in the Software\Google\Update key.
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetGoogleUpdateVersion, TestEmptyValue) {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WriteValue(google_update::kRegGoogleUpdateVersion, L"");
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid());
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetGoogleUpdateVersion returns the correct string if there's a
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version value in the Software\Google\Update key.
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetGoogleUpdateVersion, TestRealValue) {
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WriteValue(google_update::kRegGoogleUpdateVersion, kDummyVersion);
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Version expected(base::UTF16ToUTF8(kDummyVersion));
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected.Equals(
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_)));
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that there's no value in the other level (user or system).
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(!system_install_)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .IsValid());
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(GetGoogleUpdateVersionAtLevel, GetGoogleUpdateVersion,
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        testing::Bool());
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test values for use by the CollectStatsConsent test fixture.
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatsState {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum InstallType {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SINGLE_INSTALL,
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MULTI_INSTALL,
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum StateSetting {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NO_SETTING,
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FALSE_SETTING,
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRUE_SETTING,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct UserLevelState {};
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SystemLevelState {};
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const UserLevelState kUserLevel;
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const SystemLevelState kSystemLevel;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatsState(const UserLevelState&,
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             InstallType install_type,
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             StateSetting state_value)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : system_level_(false),
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        multi_install_(install_type == MULTI_INSTALL),
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_value_(state_value),
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_medium_value_(NO_SETTING) {
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatsState(const SystemLevelState&,
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             InstallType install_type,
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             StateSetting state_value,
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             StateSetting state_medium_value)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : system_level_(true),
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        multi_install_(install_type == MULTI_INSTALL),
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_value_(state_value),
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_medium_value_(state_medium_value) {
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool system_level() const { return system_level_; }
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool multi_install() const { return multi_install_; }
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY root_key() const {
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateSetting state_value() const { return state_value_; }
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateSetting state_medium_value() const {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return state_medium_value_;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_consent_granted() const {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (system_level_ && state_medium_value_ != NO_SETTING) ?
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (state_medium_value_ == TRUE_SETTING) :
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (state_value_ == TRUE_SETTING);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool system_level_;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool multi_install_;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateSetting state_value_;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateSetting state_medium_value_;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StatsState::UserLevelState StatsState::kUserLevel;
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StatsState::SystemLevelState StatsState::kSystemLevel;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A value parameterized test for testing the stats collection consent setting.
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CollectStatsConsent : public ::testing::TestWithParam<StatsState> {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetUpTestCase();
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void TearDownTestCase();
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void MakeChromeMultiInstall(HKEY root_key);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ApplySetting(StatsState::StateSetting setting,
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           HKEY root_key,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::wstring& reg_key);
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* chrome_version_key_;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* chrome_state_key_;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* chrome_state_medium_key_;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* binaries_state_key_;
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* binaries_state_medium_key_;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_util::RegistryOverrideManager override_manager_;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::chrome_version_key_;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::chrome_state_key_;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::chrome_state_medium_key_;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::binaries_state_key_;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::binaries_state_medium_key_;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::SetUpTestCase() {
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserDistribution* dist =
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::GetSpecificDistribution(
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserDistribution::CHROME_BROWSER);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_version_key_ = new std::wstring(dist->GetVersionKey());
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_state_key_ = new std::wstring(dist->GetStateKey());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_state_medium_key_ = new std::wstring(dist->GetStateMediumKey());
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dist = BrowserDistribution::GetSpecificDistribution(
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::CHROME_BINARIES);
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  binaries_state_key_ = new std::wstring(dist->GetStateKey());
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  binaries_state_medium_key_ = new std::wstring(dist->GetStateMediumKey());
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::TearDownTestCase() {
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete chrome_version_key_;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete chrome_state_key_;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete chrome_state_medium_key_;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete binaries_state_key_;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete binaries_state_medium_key_;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Install the registry override and apply the settings to the registry.
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::SetUp() {
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const StatsState& stats_state = GetParam();
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HKEY root_key = stats_state.root_key();
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring reg_temp_name(stats_state.system_level() ? L"HKLM_" : L"HKCU_");
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reg_temp_name += L"CollectStatsConsent";
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  override_manager_.OverrideRegistry(root_key, reg_temp_name);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stats_state.multi_install()) {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeChromeMultiInstall(root_key);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplySetting(stats_state.state_value(), root_key, *binaries_state_key_);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplySetting(stats_state.state_medium_value(), root_key,
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 *binaries_state_medium_key_);
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplySetting(stats_state.state_value(), root_key, *chrome_state_key_);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplySetting(stats_state.state_medium_value(), root_key,
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 *chrome_state_medium_key_);
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Write values into the registry so that Chrome is considered to be installed
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as multi-install.
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::MakeChromeMultiInstall(HKEY root_key) {
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ERROR_SUCCESS,
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegKey(root_key, chrome_version_key_->c_str(),
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             KEY_SET_VALUE).WriteValue(google_update::kRegVersionField,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       L"1.2.3.4"));
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ERROR_SUCCESS,
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegKey(root_key, chrome_state_key_->c_str(),
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             KEY_SET_VALUE).WriteValue(installer::kUninstallArgumentsField,
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       L"--multi-install"));
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Write the correct value to represent |setting| in the registry.
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::ApplySetting(StatsState::StateSetting setting,
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       HKEY root_key,
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::wstring& reg_key) {
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting != StatsState::NO_SETTING) {
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD value = setting != StatsState::FALSE_SETTING ? 1 : 0;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ERROR_SUCCESS,
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RegKey(root_key, reg_key.c_str(),
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               KEY_SET_VALUE).WriteValue(google_update::kRegUsageStatsField,
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         value));
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that stats consent can be read.
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(CollectStatsConsent, GetCollectStatsConsentAtLevel) {
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetParam().is_consent_granted()) {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    GetParam().system_level()));
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     GetParam().system_level()));
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that stats consent can be flipped to the opposite setting, that the new
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// setting takes affect, and that the correct registry location is modified.
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(CollectStatsConsent, SetCollectStatsConsentAtLevel) {
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::SetCollectStatsConsentAtLevel(
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  GetParam().system_level(),
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  !GetParam().is_consent_granted()));
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::wstring* const reg_keys[] = {
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_state_key_,
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_state_medium_key_,
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    binaries_state_key_,
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    binaries_state_medium_key_,
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int key_index = ((GetParam().system_level() ? 1 : 0) +
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (GetParam().multi_install() ? 2 : 0));
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::wstring& reg_key = *reg_keys[key_index];
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD value = 0;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ERROR_SUCCESS,
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegKey(GetParam().root_key(), reg_key.c_str(),
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             KEY_QUERY_VALUE).ReadValueDW(google_update::kRegUsageStatsField,
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          &value));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetParam().is_consent_granted()) {
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     GetParam().system_level()));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0UL, value);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    GetParam().system_level()));
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1UL, value);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UserLevelSingleInstall,
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollectStatsConsent,
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Values(
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING),
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING),
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING)));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UserLevelMultiInstall,
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollectStatsConsent,
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Values(
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING),
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING),
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING)));
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SystemLevelSingleInstall,
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollectStatsConsent,
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Values(
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::NO_SETTING),
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::FALSE_SETTING),
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::TRUE_SETTING),
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::NO_SETTING),
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::FALSE_SETTING),
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::TRUE_SETTING),
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::NO_SETTING),
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::FALSE_SETTING),
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::TRUE_SETTING)));
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SystemLevelMultiInstall,
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollectStatsConsent,
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Values(
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::NO_SETTING),
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::FALSE_SETTING),
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::TRUE_SETTING),
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::NO_SETTING),
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::FALSE_SETTING),
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::TRUE_SETTING),
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::NO_SETTING),
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::FALSE_SETTING),
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::TRUE_SETTING)));
1026