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 kTestProductGuid[] = L"{89F1B351-B15D-48D4-8F10-1298721CF13D}";
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const wchar_t kTestExperimentLabel[] = L"test_label_value";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test fixture redirects the HKLM and HKCU registry hives for
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the duration of the test to make it independent of the machine
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and user settings.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GoogleUpdateSettingsTest : public testing::Test {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_overrides_.OverrideRegistry(HKEY_LOCAL_MACHINE, L"HKLM_pit");
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_overrides_.OverrideRegistry(HKEY_CURRENT_USER, L"HKCU_pit");
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum SystemUserInstall {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SYSTEM_INSTALL,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    USER_INSTALL,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetApField(SystemUserInstall is_system, const wchar_t* value) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HKEY root = is_system == SYSTEM_INSTALL ?
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey update_key;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserDistribution* dist = BrowserDistribution::GetDistribution();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring path = dist->GetStateKey();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ERROR_SUCCESS, update_key.Create(root, path.c_str(), KEY_WRITE));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ERROR_SUCCESS, update_key.WriteValue(L"ap", value));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Sets the "ap" field for a multi-install product (both the product and
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // the binaries).
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SetMultiApField(SystemUserInstall is_system, const wchar_t* value) {
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Caller must specify a multi-install ap value.
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ASSERT_NE(std::wstring::npos, std::wstring(value).find(L"-multi"));
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    HKEY root = is_system == SYSTEM_INSTALL ?
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RegKey update_key;
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Write the ap value for both the product and the binaries.
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    BrowserDistribution* const kDists[] = {
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BrowserDistribution::GetDistribution(),
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BrowserDistribution::GetSpecificDistribution(
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          BrowserDistribution::CHROME_BINARIES)
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    };
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (size_t i = 0; i < arraysize(kDists); ++i) {
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      std::wstring path = kDists[i]->GetStateKey();
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS, update_key.Create(root, path.c_str(),
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                 KEY_WRITE));
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS, update_key.WriteValue(L"ap", value));
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Make the product technically multi-install.
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    BrowserDistribution* dist = BrowserDistribution::GetDistribution();
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ASSERT_EQ(ERROR_SUCCESS,
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              update_key.Create(root, dist->GetStateKey().c_str(), KEY_WRITE));
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ASSERT_EQ(ERROR_SUCCESS,
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              update_key.WriteValue(installer::kUninstallArgumentsField,
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    L"--multi-install"));
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests setting the ap= value to various combinations of values with
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefixes and suffixes, while asserting on the correct channel value.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that any non-empty ap= value that doesn't match ".*-{dev|beta}.*"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will return the "unknown" channel.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestCurrentChromeChannelWithVariousApValues(SystemUserInstall install) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static struct Expectations {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const wchar_t* ap_value;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const wchar_t* channel;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } expectations[] = {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"dev", installer::kChromeChannelDev },
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"-dev", installer::kChromeChannelDev },
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"-developer", installer::kChromeChannelDev },
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"beta", installer::kChromeChannelBeta },
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"-beta", installer::kChromeChannelBeta },
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { L"-betamax", installer::kChromeChannelBeta },
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_system = install == SYSTEM_INSTALL;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* prefixes[] = {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"",
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"prefix",
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"prefix-with-dash",
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* suffixes[] = {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"",
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"suffix",
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"suffix-with-dash",
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < arraysize(prefixes); ++i) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t j = 0; j < arraysize(expectations); ++j) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (size_t k = 0; k < arraysize(suffixes); ++k) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          std::wstring ap = prefixes[i];
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ap += expectations[j].ap_value;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ap += suffixes[k];
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const wchar_t* channel = expectations[j].channel;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SetApField(install, ap.c_str());
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::string16 ret_channel;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              is_system, &ret_channel));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_STREQ(channel, ret_channel.c_str())
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << "Expecting channel \"" << channel
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << "\" for ap=\"" << ap << "\"";
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test the writing and deleting functionality of the experiments label
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // helper.
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TestExperimentsLabelHelper(SystemUserInstall install) {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserDistribution* chrome =
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserDistribution::GetSpecificDistribution(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            BrowserDistribution::CHROME_BROWSER);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::wstring value;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(chrome->ShouldSetExperimentLabels());
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Before anything is set, ReadExperimentLabels should succeed but return
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // an empty string.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, &value));
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::string16(), value);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::SetExperimentLabels(
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, kTestExperimentLabel));
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Validate that something is written. Only worry about the label itself.
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RegKey key;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HKEY root = install == SYSTEM_INSTALL ?
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 state_key = install == SYSTEM_INSTALL ?
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome->GetStateMediumKey() : chrome->GetStateKey();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              key.Open(root, state_key.c_str(), KEY_QUERY_VALUE));
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        key.ReadValue(google_update::kExperimentLabels, &value));
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kTestExperimentLabel, value);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, &value));
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kTestExperimentLabel, value);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    key.Close();
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Now that the label is set, test the delete functionality. An empty label
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // should result in deleting the value.
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::SetExperimentLabels(
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        install == SYSTEM_INSTALL, base::string16()));
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              key.Open(root, state_key.c_str(), KEY_QUERY_VALUE));
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERROR_FILE_NOT_FOUND,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        key.ReadValue(google_update::kExperimentLabels, &value));
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, &value));
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::string16(), value);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    key.Close();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(chrome->ShouldSetExperimentLabels());
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(GoogleUpdateSettings::ReadExperimentLabels(
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        install == SYSTEM_INSTALL, &value));
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // GOOGLE_CHROME_BUILD
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates "ap" key with the value given as parameter. Also adds work
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // items to work_item_list given so that they can be rolled back later.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateApKey(WorkItemList* work_item_list, const std::wstring& value) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HKEY reg_root = HKEY_CURRENT_USER;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring reg_key = GetApKeyPath();
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    work_item_list->AddCreateRegKeyWorkItem(
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        reg_root, reg_key, WorkItem::kWow64Default);
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    work_item_list->AddSetRegValueWorkItem(reg_root,
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           reg_key,
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           WorkItem::kWow64Default,
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           google_update::kRegApField,
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           value.c_str(),
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           true);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!work_item_list->Do()) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      work_item_list->Rollback();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the key path of "ap" key, e.g.:
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Google\Update\ClientState\<kTestProductGuid>
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring GetApKeyPath() {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring reg_key(google_update::kRegPathClientState);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reg_key.append(L"\\");
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reg_key.append(kTestProductGuid);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reg_key;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Utility method to read "ap" key value
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring ReadApKeyValue() {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey key;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring ap_key_value;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring reg_key = GetApKeyPath();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) ==
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ERROR_SUCCESS) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.ReadValue(google_update::kRegApField, &ap_key_value);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ap_key_value;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool SetUpdatePolicyForAppGuid(const base::string16& app_guid,
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 GoogleUpdateSettings::UpdatePolicy policy) {
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RegKey policy_key;
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (policy_key.Create(HKEY_LOCAL_MACHINE,
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          GoogleUpdateSettings::kPoliciesKey,
239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          KEY_SET_VALUE) == ERROR_SUCCESS) {
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::string16 app_update_override(
241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          GoogleUpdateSettings::kUpdateOverrideValuePrefix);
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      app_update_override.append(app_guid);
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return policy_key.WriteValue(app_update_override.c_str(),
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                   static_cast<DWORD>(policy)) == ERROR_SUCCESS;
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return false;
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DWORD GetUpdatePolicyForAppGuid(const base::string16& app_guid) {
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RegKey policy_key;
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (policy_key.Create(HKEY_LOCAL_MACHINE,
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          GoogleUpdateSettings::kPoliciesKey,
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          KEY_QUERY_VALUE) == ERROR_SUCCESS) {
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::string16 app_update_override(
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          GoogleUpdateSettings::kUpdateOverrideValuePrefix);
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      app_update_override.append(app_guid);
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      DWORD value = -1;
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (policy_key.ReadValueDW(app_update_override.c_str(),
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 &value) == ERROR_SUCCESS) {
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return value;
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      }
263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return -1;
265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool SetGlobalUpdatePolicy(GoogleUpdateSettings::UpdatePolicy policy) {
268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RegKey policy_key;
269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return policy_key.Create(HKEY_LOCAL_MACHINE,
270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             GoogleUpdateSettings::kPoliciesKey,
271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             KEY_SET_VALUE) == ERROR_SUCCESS &&
272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch           policy_key.WriteValue(GoogleUpdateSettings::kUpdatePolicyValue,
273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 static_cast<DWORD>(policy)) == ERROR_SUCCESS;
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DWORD GetGlobalUpdatePolicy() {
277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RegKey policy_key;
278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DWORD value = -1;
279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return (policy_key.Create(HKEY_LOCAL_MACHINE,
280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              GoogleUpdateSettings::kPoliciesKey,
281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              KEY_QUERY_VALUE) == ERROR_SUCCESS &&
282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            policy_key.ReadValueDW(GoogleUpdateSettings::kUpdatePolicyValue,
283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                   &value) == ERROR_SUCCESS) ? value : -1;
284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool SetUpdateTimeoutOverride(DWORD time_in_minutes) {
287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RegKey policy_key;
288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return policy_key.Create(HKEY_LOCAL_MACHINE,
289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             GoogleUpdateSettings::kPoliciesKey,
290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             KEY_SET_VALUE) == ERROR_SUCCESS &&
291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch           policy_key.WriteValue(
292effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               GoogleUpdateSettings::kCheckPeriodOverrideMinutes,
293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               time_in_minutes) == ERROR_SUCCESS;
294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_util::RegistryOverrideManager registry_overrides_;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we return success on no registration (which means stable),
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether per-system or per-user install.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelAbsent) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per-system first.
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 channel;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then per-user.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test an empty Ap key for system and user.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelEmptySystem) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetApField(SYSTEM_INSTALL, L"");
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 channel;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per-user lookups still succeed and return empty string.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelEmptyUser) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetApField(USER_INSTALL, L"");
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per-system lookups still succeed and return empty string.
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 channel;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(true,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Per-user lookup should succeed.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                 &channel));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(L"", channel.c_str());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Test that the channel is pulled from the binaries for multi-install products.
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, MultiInstallChannelFromBinaries) {
34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetMultiApField(USER_INSTALL, L"2.0-dev-multi-chrome");
34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::string16 channel;
34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
34946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                                 &channel));
35146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_STREQ(L"dev-m", channel.c_str());
35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // See if the same happens if the product's ap is cleared.
35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetApField(USER_INSTALL, L"");
35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                                 &channel));
35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_STREQ(L"dev-m", channel.c_str());
35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Test the converse (binaries are stable, Chrome is other).
36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetMultiApField(USER_INSTALL, L"-multi-chrome");
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetApField(USER_INSTALL, L"2.0-dev-multi-chrome");
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::GetChromeChannelAndModifiers(false,
36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                                 &channel));
36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_STREQ(L"m", channel.c_str());
36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelVariousApValuesSystem) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCurrentChromeChannelWithVariousApValues(SYSTEM_INSTALL);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, CurrentChromeChannelVariousApValuesUser) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCurrentChromeChannelWithVariousApValues(USER_INSTALL);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Run through all combinations of diff vs. full install, single vs. multi
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// install, success and failure results, and a fistful of initial "ap" values
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// checking that the expected final "ap" value is generated by
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GoogleUpdateSettings::UpdateGoogleUpdateApKey.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, UpdateGoogleUpdateApKey) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const installer::ArchiveType archive_types[] = {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::UNKNOWN_ARCHIVE_TYPE,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::FULL_ARCHIVE_TYPE,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::INCREMENTAL_ARCHIVE_TYPE
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int results[] = {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::FIRST_INSTALL_SUCCESS,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer::INSTALL_FAILED
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const plain[] = {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"",
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1",
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-dev"
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const full[] = {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"-full",
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-full",
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-dev-full"
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(full) == arraysize(plain), bad_full_array_size);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const multifail[] = {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"-multifail",
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-multifail",
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-dev-multifail"
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(multifail) == arraysize(plain),
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 bad_multifail_array_size);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const multifail_full[] = {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"-multifail-full",
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-multifail-full",
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"1.1-dev-multifail-full"
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(multifail_full) == arraysize(plain),
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 bad_multifail_full_array_size);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* const* input_arrays[] = {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plain,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    multifail,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    multifail_full
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChannelInfo v;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int type_idx = 0; type_idx < arraysize(archive_types); ++type_idx) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const installer::ArchiveType archive_type = archive_types[type_idx];
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int result_idx = 0; result_idx < arraysize(results); ++result_idx) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const int result = results[result_idx];
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The archive type will/must always be known on install success.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (archive_type == installer::UNKNOWN_ARCHIVE_TYPE &&
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          result == installer::FIRST_INSTALL_SUCCESS) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const wchar_t* const* outputs = NULL;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (result == installer::FIRST_INSTALL_SUCCESS ||
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          archive_type == installer::FULL_ARCHIVE_TYPE) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        outputs = plain;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (archive_type == installer::INCREMENTAL_ARCHIVE_TYPE) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        outputs = full;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }  // else if (archive_type == UNKNOWN) see below
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int inputs_idx = 0; inputs_idx < arraysize(input_arrays);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ++inputs_idx) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const wchar_t* const* inputs = input_arrays[inputs_idx];
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (archive_type == installer::UNKNOWN_ARCHIVE_TYPE) {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // "-full" is untouched if the archive type is unknown.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // "-multifail" is unconditionally removed.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (inputs == full || inputs == multifail_full)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            outputs = full;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            outputs = plain;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int input_idx = 0; input_idx < arraysize(plain); ++input_idx) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const wchar_t* input = inputs[input_idx];
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const wchar_t* output = outputs[input_idx];
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v.set_value(input);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (output == v.value()) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EXPECT_FALSE(GoogleUpdateSettings::UpdateGoogleUpdateApKey(
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                archive_type, result, &v))
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << "archive_type: " << archive_type
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << ", result: " << result
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << ", input ap value: " << input;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EXPECT_TRUE(GoogleUpdateSettings::UpdateGoogleUpdateApKey(
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                archive_type, result, &v))
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << "archive_type: " << archive_type
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << ", result: " << result
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << ", input ap value: " << input;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_EQ(output, v.value())
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << "archive_type: " << archive_type
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", result: " << result
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ", input ap value: " << input;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, UpdateInstallStatusTest) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test incremental install failure
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateApKey(work_item_list.get(), L""))
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed to create ap key.";
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INCREMENTAL_ARCHIVE_TYPE,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INSTALL_FAILED,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full");
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list.reset(WorkItem::CreateWorkItemList());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test incremental install success
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateApKey(work_item_list.get(), L""))
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed to create ap key.";
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INCREMENTAL_ARCHIVE_TYPE,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::FIRST_INSTALL_SUCCESS,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list.reset(WorkItem::CreateWorkItemList());
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test full install failure
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateApKey(work_item_list.get(), L"-full"))
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed to create ap key.";
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INSTALL_FAILED,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list.reset(WorkItem::CreateWorkItemList());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test full install success
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateApKey(work_item_list.get(), L"-full"))
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed to create ap key.";
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::FIRST_INSTALL_SUCCESS,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list.reset(WorkItem::CreateWorkItemList());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test the case of when "ap" key doesnt exist at all
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring ap_key_value = ReadApKeyValue();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring reg_key = GetApKeyPath();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY reg_root = HKEY_CURRENT_USER;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ap_key_deleted = false;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS) !=
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ERROR_SUCCESS) {
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    work_item_list->AddCreateRegKeyWorkItem(
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        reg_root, reg_key, WorkItem::kWow64Default);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(work_item_list->Do()) << "Failed to create ClientState key.";
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (key.DeleteValue(google_update::kRegApField) == ERROR_SUCCESS) {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ap_key_deleted = true;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try differential installer
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INCREMENTAL_ARCHIVE_TYPE,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INSTALL_FAILED,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"-full");
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try full installer now
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleUpdateSettings::UpdateInstallStatus(false, installer::FULL_ARCHIVE_TYPE,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            installer::INSTALL_FAILED,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kTestProductGuid);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(ReadApKeyValue().c_str(), L"");
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now cleanup to leave the system in unchanged state.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - Diff installer creates an ap key if it didnt exist, so delete this ap key
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - If we created any reg key path for ap, roll it back
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - Finally restore the original value of ap key.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key.Open(HKEY_CURRENT_USER, reg_key.c_str(), KEY_ALL_ACCESS);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key.DeleteValue(google_update::kRegApField);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item_list->Rollback();
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ap_key_deleted) {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    work_item_list.reset(WorkItem::CreateWorkItemList());
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(CreateApKey(work_item_list.get(), ap_key_value))
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Failed to restore ap key.";
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, SetEULAConsent) {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using installer::FakeInstallationState;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool multi_install = true;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool system_level = true;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeInstallationState machine_state;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Chrome is installed.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  machine_state.AddChrome(system_level, multi_install,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new Version(chrome::kChromeVersion));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD value;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserDistribution* binaries =
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::GetSpecificDistribution(
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserDistribution::CHROME_BINARIES);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserDistribution* chrome =
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::GetSpecificDistribution(
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserDistribution::CHROME_BROWSER);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // eulaconsent is set on both the product and the binaries.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::SetEULAConsent(machine_state, chrome,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   true));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_LOCAL_MACHINE, binaries->GetStateMediumKey().c_str(),
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               KEY_QUERY_VALUE));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.ReadValueDW(google_update::kRegEULAAceptedField, &value));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, value);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_LOCAL_MACHINE, chrome->GetStateMediumKey().c_str(),
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               KEY_QUERY_VALUE));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.ReadValueDW(google_update::kRegEULAAceptedField, &value));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, value);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the appropriate default is returned if no update override is
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// present.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyNoOverride) {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There are no policies at all.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_FILE_NOT_FOUND,
602effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey().Open(HKEY_LOCAL_MACHINE,
603effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          GoogleUpdateSettings::kPoliciesKey,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE));
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_overridden = true;
606effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::kDefaultUpdatePolicy,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The policy key exists, but there are no values of interest present.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
613effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey().Create(HKEY_LOCAL_MACHINE,
614effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            GoogleUpdateSettings::kPoliciesKey,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            KEY_SET_VALUE));
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
617effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey().Open(HKEY_LOCAL_MACHINE,
618effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          GoogleUpdateSettings::kPoliciesKey,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
621effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::kDefaultUpdatePolicy,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the default override is returned if no app-specific override is
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// present.
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyDefaultOverride) {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
633effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
634effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   KEY_SET_VALUE).WriteValue(
635effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       GoogleUpdateSettings::kUpdatePolicyValue,
636effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       static_cast<DWORD>(0)));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_overridden = true;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED,
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
644effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
645effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   KEY_SET_VALUE).WriteValue(
646effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       GoogleUpdateSettings::kUpdatePolicyValue,
647effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       static_cast<DWORD>(1)));
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
655effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
656effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   KEY_SET_VALUE).WriteValue(
657effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       GoogleUpdateSettings::kUpdatePolicyValue,
658effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       static_cast<DWORD>(2)));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::MANUAL_UPDATES_ONLY,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
666effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
667effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   KEY_SET_VALUE).WriteValue(
668effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       GoogleUpdateSettings::kUpdatePolicyValue,
669effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       static_cast<DWORD>(3)));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::AUTO_UPDATES_ONLY,
672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                     &is_overridden));
674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(is_overridden);
675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The default policy should be in force for bogus values.
677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ERROR_SUCCESS,
678effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
679effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   KEY_SET_VALUE).WriteValue(
680effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       GoogleUpdateSettings::kUpdatePolicyValue,
681effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       static_cast<DWORD>(4)));
682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  is_overridden = true;
683effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::kDefaultUpdatePolicy,
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an app-specific override is used if present.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, GetAppUpdatePolicyAppOverride) {
691effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::wstring app_policy_value(
692effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::kUpdateOverrideValuePrefix);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_policy_value.append(kTestProductGuid);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
696effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
697effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   KEY_SET_VALUE).WriteValue(
698effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       GoogleUpdateSettings::kUpdatePolicyValue,
699effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       static_cast<DWORD>(1)));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
701effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(0)));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_overridden = false;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_overridden);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
711effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
712effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   KEY_SET_VALUE).WriteValue(
713effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       GoogleUpdateSettings::kUpdatePolicyValue,
714effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       static_cast<DWORD>(0)));
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
716effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(1)));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = false;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES,
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_overridden);
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
726effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(2)));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = false;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::MANUAL_UPDATES_ONLY,
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(is_overridden);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
736effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<DWORD>(3)));
739eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  is_overridden = false;
740eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::AUTO_UPDATES_ONLY,
741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
742eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                     &is_overridden));
743eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(is_overridden);
744eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
745eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The default policy should be in force for bogus values.
746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ERROR_SUCCESS,
747effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            RegKey(HKEY_LOCAL_MACHINE, GoogleUpdateSettings::kPoliciesKey,
748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   KEY_SET_VALUE).WriteValue(app_policy_value.c_str(),
749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             static_cast<DWORD>(4)));
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_overridden = true;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED,
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &is_overridden));
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(is_overridden);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
757effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(GoogleUpdateSettingsTest, PerAppUpdatesDisabledByPolicy) {
758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      SetUpdatePolicyForAppGuid(kTestProductGuid,
760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                GoogleUpdateSettings::UPDATES_DISABLED));
761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool is_overridden = false;
762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GoogleUpdateSettings::UpdatePolicy update_policy =
763effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
764effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               &is_overridden);
765effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(is_overridden);
766effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED, update_policy);
767effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
768effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
769effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
770effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid));
771effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  update_policy = GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
772effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                           &is_overridden);
773effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Should still have a policy but now that policy should explicitly enable
774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // updates.
775effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(is_overridden);
776effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES, update_policy);
777effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
778effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
779effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
780effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(GoogleUpdateSettingsTest, PerAppUpdatesEnabledWithGlobalDisabled) {
781effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Disable updates globally but enable them for our specific app (the app-
782effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // specific setting should take precedence).
783effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
784effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      SetUpdatePolicyForAppGuid(kTestProductGuid,
785effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                GoogleUpdateSettings::AUTOMATIC_UPDATES));
786effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(SetGlobalUpdatePolicy(GoogleUpdateSettings::UPDATES_DISABLED));
787effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
788effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Make sure we read this as still having updates enabled.
789effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
790effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
791effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Make sure that the reset action returns true and is a no-op.
792effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
793effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid));
794effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(static_cast<DWORD>(GoogleUpdateSettings::AUTOMATIC_UPDATES),
795effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            GetUpdatePolicyForAppGuid(kTestProductGuid));
796effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(static_cast<DWORD>(GoogleUpdateSettings::UPDATES_DISABLED),
797effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            GetGlobalUpdatePolicy());
798effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
799effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
800effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(GoogleUpdateSettingsTest, GlobalUpdatesDisabledByPolicy) {
801effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(SetGlobalUpdatePolicy(GoogleUpdateSettings::UPDATES_DISABLED));
802effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool is_overridden = false;
803effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
804effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The contract for GetAppUpdatePolicy states that |is_overridden| should be
805effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // set to false when updates are disabled on a non-app-specific basis.
806effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GoogleUpdateSettings::UpdatePolicy update_policy =
807effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
808effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               &is_overridden);
809effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(is_overridden);
810effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::UPDATES_DISABLED, update_policy);
811effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
812effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
813effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
814effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid));
815effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  update_policy = GoogleUpdateSettings::GetAppUpdatePolicy(kTestProductGuid,
816effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                           &is_overridden);
817effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Policy should now be to enable updates, |is_overridden| should still be
818effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // false.
819effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(is_overridden);
820effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GoogleUpdateSettings::AUTOMATIC_UPDATES, update_policy);
821effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
822effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
823effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
824effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(GoogleUpdateSettingsTest, UpdatesDisabledByTimeout) {
825effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Disable updates altogether.
826effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(SetUpdateTimeoutOverride(0));
827effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
828effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
829effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid));
830effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
831effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
832effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Set the update period to something unreasonable.
833effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(SetUpdateTimeoutOverride(
834effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::kCheckPeriodOverrideMinutesMax + 1));
835effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
836effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
837effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GoogleUpdateSettings::ReenableAutoupdatesForApp(kTestProductGuid));
838effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(GoogleUpdateSettings::AreAutoupdatesEnabled(kTestProductGuid));
839effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
840effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, ExperimentsLabelHelperSystem) {
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestExperimentsLabelHelper(SYSTEM_INSTALL);
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GoogleUpdateSettingsTest, ExperimentsLabelHelperUser) {
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestExperimentsLabelHelper(USER_INSTALL);
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(GOOGLE_CHROME_BUILD)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test GoogleUpdateSettings::GetUninstallCommandLine at system- or user-level,
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// according to the param.
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetUninstallCommandLine : public GoogleUpdateSettingsTest,
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                public testing::WithParamInterface<bool> {
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kDummyCommand[];
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoogleUpdateSettingsTest::SetUp();
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system_install_ = GetParam();
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_key_ = system_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY root_key_;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool system_install_;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t GetUninstallCommandLine::kDummyCommand[] =
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"\"goopdate.exe\" /spam";
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetUninstallCommandLine returns an empty string if there's no
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Software\Google\Update key.
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetUninstallCommandLine, TestNoKey) {
8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(),
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(system_install_));
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetUninstallCommandLine returns an empty string if there's no
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UninstallCmdLine value in the Software\Google\Update key.
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetUninstallCommandLine, TestNoValue) {
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE);
8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(),
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(system_install_));
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetUninstallCommandLine returns an empty string if there's an
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// empty UninstallCmdLine value in the Software\Google\Update key.
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetUninstallCommandLine, TestEmptyValue) {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WriteValue(google_update::kRegUninstallCmdLine, L"");
8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(),
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(system_install_));
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetUninstallCommandLine returns the correct string if there's an
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UninstallCmdLine value in the Software\Google\Update key.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetUninstallCommandLine, TestRealValue) {
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WriteValue(google_update::kRegUninstallCmdLine, kDummyCommand);
9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(kDummyCommand),
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(system_install_));
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that there's no value in the other level (user or system).
9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(),
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GoogleUpdateSettings::GetUninstallCommandLine(!system_install_));
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(GetUninstallCommandLineAtLevel, GetUninstallCommandLine,
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        testing::Bool());
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test GoogleUpdateSettings::GetGoogleUpdateVersion at system- or user-level,
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// according to the param.
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetGoogleUpdateVersion : public GoogleUpdateSettingsTest,
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               public testing::WithParamInterface<bool> {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kDummyVersion[];
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GoogleUpdateSettingsTest::SetUp();
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system_install_ = GetParam();
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_key_ = system_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY root_key_;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool system_install_;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t GetGoogleUpdateVersion::kDummyVersion[] = L"1.2.3.4";
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetGoogleUpdateVersion returns an empty string if there's no
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Software\Google\Update key.
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetGoogleUpdateVersion, TestNoKey) {
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid());
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetGoogleUpdateVersion returns an empty string if there's no
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version value in the Software\Google\Update key.
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetGoogleUpdateVersion, TestNoValue) {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid());
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetGoogleUpdateVersion returns an empty string if there's an
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// empty version value in the Software\Google\Update key.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetGoogleUpdateVersion, TestEmptyValue) {
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WriteValue(google_update::kRegGoogleUpdateVersion, L"");
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_).IsValid());
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetGoogleUpdateVersion returns the correct string if there's a
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version value in the Software\Google\Update key.
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(GetGoogleUpdateVersion, TestRealValue) {
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey(root_key_, google_update::kRegPathGoogleUpdate, KEY_SET_VALUE)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WriteValue(google_update::kRegGoogleUpdateVersion, kDummyVersion);
9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Version expected(base::UTF16ToUTF8(kDummyVersion));
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected.Equals(
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(system_install_)));
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that there's no value in the other level (user or system).
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleUpdateSettings::GetGoogleUpdateVersion(!system_install_)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .IsValid());
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(GetGoogleUpdateVersionAtLevel, GetGoogleUpdateVersion,
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        testing::Bool());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test values for use by the CollectStatsConsent test fixture.
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatsState {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum InstallType {
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SINGLE_INSTALL,
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MULTI_INSTALL,
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum StateSetting {
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NO_SETTING,
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FALSE_SETTING,
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRUE_SETTING,
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct UserLevelState {};
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SystemLevelState {};
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const UserLevelState kUserLevel;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const SystemLevelState kSystemLevel;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatsState(const UserLevelState&,
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             InstallType install_type,
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             StateSetting state_value)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : system_level_(false),
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        multi_install_(install_type == MULTI_INSTALL),
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_value_(state_value),
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_medium_value_(NO_SETTING) {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatsState(const SystemLevelState&,
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             InstallType install_type,
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             StateSetting state_value,
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             StateSetting state_medium_value)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : system_level_(true),
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        multi_install_(install_type == MULTI_INSTALL),
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_value_(state_value),
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_medium_value_(state_medium_value) {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool system_level() const { return system_level_; }
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool multi_install() const { return multi_install_; }
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY root_key() const {
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateSetting state_value() const { return state_value_; }
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateSetting state_medium_value() const {
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return state_medium_value_;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_consent_granted() const {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (system_level_ && state_medium_value_ != NO_SETTING) ?
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (state_medium_value_ == TRUE_SETTING) :
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (state_value_ == TRUE_SETTING);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1018effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool system_level_;
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool multi_install_;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateSetting state_value_;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateSetting state_medium_value_;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StatsState::UserLevelState StatsState::kUserLevel;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const StatsState::SystemLevelState StatsState::kSystemLevel;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A value parameterized test for testing the stats collection consent setting.
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CollectStatsConsent : public ::testing::TestWithParam<StatsState> {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetUpTestCase();
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void TearDownTestCase();
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void MakeChromeMultiInstall(HKEY root_key);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ApplySetting(StatsState::StateSetting setting,
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           HKEY root_key,
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::wstring& reg_key);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* chrome_version_key_;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* chrome_state_key_;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* chrome_state_medium_key_;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* binaries_state_key_;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::wstring* binaries_state_medium_key_;
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_util::RegistryOverrideManager override_manager_;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::chrome_version_key_;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::chrome_state_key_;
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::chrome_state_medium_key_;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::binaries_state_key_;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring* CollectStatsConsent::binaries_state_medium_key_;
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::SetUpTestCase() {
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserDistribution* dist =
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::GetSpecificDistribution(
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserDistribution::CHROME_BROWSER);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_version_key_ = new std::wstring(dist->GetVersionKey());
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_state_key_ = new std::wstring(dist->GetStateKey());
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_state_medium_key_ = new std::wstring(dist->GetStateMediumKey());
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dist = BrowserDistribution::GetSpecificDistribution(
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserDistribution::CHROME_BINARIES);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  binaries_state_key_ = new std::wstring(dist->GetStateKey());
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  binaries_state_medium_key_ = new std::wstring(dist->GetStateMediumKey());
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::TearDownTestCase() {
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete chrome_version_key_;
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete chrome_state_key_;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete chrome_state_medium_key_;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete binaries_state_key_;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete binaries_state_medium_key_;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Install the registry override and apply the settings to the registry.
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::SetUp() {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const StatsState& stats_state = GetParam();
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HKEY root_key = stats_state.root_key();
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring reg_temp_name(stats_state.system_level() ? L"HKLM_" : L"HKCU_");
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reg_temp_name += L"CollectStatsConsent";
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  override_manager_.OverrideRegistry(root_key, reg_temp_name);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stats_state.multi_install()) {
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeChromeMultiInstall(root_key);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplySetting(stats_state.state_value(), root_key, *binaries_state_key_);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplySetting(stats_state.state_medium_value(), root_key,
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 *binaries_state_medium_key_);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplySetting(stats_state.state_value(), root_key, *chrome_state_key_);
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplySetting(stats_state.state_medium_value(), root_key,
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 *chrome_state_medium_key_);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Write values into the registry so that Chrome is considered to be installed
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as multi-install.
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::MakeChromeMultiInstall(HKEY root_key) {
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ERROR_SUCCESS,
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegKey(root_key, chrome_version_key_->c_str(),
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             KEY_SET_VALUE).WriteValue(google_update::kRegVersionField,
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       L"1.2.3.4"));
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ERROR_SUCCESS,
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegKey(root_key, chrome_state_key_->c_str(),
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             KEY_SET_VALUE).WriteValue(installer::kUninstallArgumentsField,
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       L"--multi-install"));
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Write the correct value to represent |setting| in the registry.
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectStatsConsent::ApplySetting(StatsState::StateSetting setting,
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       HKEY root_key,
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::wstring& reg_key) {
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting != StatsState::NO_SETTING) {
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD value = setting != StatsState::FALSE_SETTING ? 1 : 0;
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ERROR_SUCCESS,
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RegKey(root_key, reg_key.c_str(),
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               KEY_SET_VALUE).WriteValue(google_update::kRegUsageStatsField,
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         value));
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that stats consent can be read.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(CollectStatsConsent, GetCollectStatsConsentAtLevel) {
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetParam().is_consent_granted()) {
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    GetParam().system_level()));
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     GetParam().system_level()));
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that stats consent can be flipped to the opposite setting, that the new
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// setting takes affect, and that the correct registry location is modified.
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(CollectStatsConsent, SetCollectStatsConsentAtLevel) {
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GoogleUpdateSettings::SetCollectStatsConsentAtLevel(
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  GetParam().system_level(),
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  !GetParam().is_consent_granted()));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::wstring* const reg_keys[] = {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_state_key_,
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_state_medium_key_,
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    binaries_state_key_,
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    binaries_state_medium_key_,
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int key_index = ((GetParam().system_level() ? 1 : 0) +
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (GetParam().multi_install() ? 2 : 0));
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::wstring& reg_key = *reg_keys[key_index];
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD value = 0;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ERROR_SUCCESS,
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegKey(GetParam().root_key(), reg_key.c_str(),
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             KEY_QUERY_VALUE).ReadValueDW(google_update::kRegUsageStatsField,
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          &value));
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetParam().is_consent_granted()) {
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     GetParam().system_level()));
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0UL, value);
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GoogleUpdateSettings::GetCollectStatsConsentAtLevel(
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    GetParam().system_level()));
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1UL, value);
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UserLevelSingleInstall,
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollectStatsConsent,
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Values(
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING),
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING),
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::SINGLE_INSTALL,
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING)));
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UserLevelMultiInstall,
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollectStatsConsent,
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Values(
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING),
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING),
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kUserLevel, StatsState::MULTI_INSTALL,
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING)));
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SystemLevelSingleInstall,
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollectStatsConsent,
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Values(
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::NO_SETTING),
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::FALSE_SETTING),
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::TRUE_SETTING),
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::NO_SETTING),
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::FALSE_SETTING),
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::TRUE_SETTING),
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::NO_SETTING),
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::FALSE_SETTING),
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::SINGLE_INSTALL,
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::TRUE_SETTING)));
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SystemLevelMultiInstall,
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollectStatsConsent,
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Values(
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::NO_SETTING),
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::FALSE_SETTING),
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::NO_SETTING, StatsState::TRUE_SETTING),
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::NO_SETTING),
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::FALSE_SETTING),
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::FALSE_SETTING, StatsState::TRUE_SETTING),
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::NO_SETTING),
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::FALSE_SETTING),
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StatsState(StatsState::kSystemLevel, StatsState::MULTI_INSTALL,
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   StatsState::TRUE_SETTING, StatsState::TRUE_SETTING)));
1233