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 <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_reg_util_win.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_constants.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/install_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/product_unittest.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/installer/util/work_item.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using registry_util::RegistryOverrideManager;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrEq;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRegistryValuePredicate : public InstallUtil::RegistryValuePredicate {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD1(Evaluate, bool(const std::wstring&));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InstallUtilTest : public TestWithTempDirAndDeleteTempOverrideKeys {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallUtilTest, MakeUninstallCommand) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::pair<std::wstring, std::wstring> params[] = {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::make_pair(std::wstring(L""), std::wstring(L"")),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::make_pair(std::wstring(L""), std::wstring(L"--do-something --silly")),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::make_pair(std::wstring(L"spam.exe"), std::wstring(L"")),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::make_pair(std::wstring(L"spam.exe"),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   std::wstring(L"--do-something --silly")),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(params); ++i) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::pair<std::wstring, std::wstring>& param = params[i];
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::MakeUninstallCommand(param.first, param.second, &command_line);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(param.first, command_line.GetProgram().value());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (param.second.empty()) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(command_line.GetSwitches().empty());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(2U, command_line.GetSwitches().size());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(command_line.HasSwitch("do-something"));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(command_line.HasSwitch("silly"));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallUtilTest, GetCurrentDate) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring date(InstallUtil::GetCurrentDate());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(8, date.length());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (date.length() == 8) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For an invalid date value, SystemTimeToFileTime will fail.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We use this to validate that we have a correct date string.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SYSTEMTIME systime = {0};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILETIME ft = {0};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Just to make sure our assumption holds.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(SystemTimeToFileTime(&systime, &ft));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now fill in the values from our string.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    systime.wYear = _wtoi(date.substr(0, 4).c_str());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    systime.wMonth = _wtoi(date.substr(4, 2).c_str());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    systime.wDay = _wtoi(date.substr(6, 2).c_str());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check if they make sense.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(SystemTimeToFileTime(&systime, &ft));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallUtilTest, UpdateInstallerStageAP) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool system_level = false;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring state_key_path(L"PhonyClientState");
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the stage when there's no "ap" value.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey(root, state_key_path.c_str(), KEY_SET_VALUE);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::UpdateInstallerStage(system_level, state_key_path,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      installer::BUILDING);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring value;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  .ReadValue(google_update::kRegApField, &value));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"-stage:building", value);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the stage when there is an "ap" value.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey(root, state_key_path.c_str(), KEY_SET_VALUE)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WriteValue(google_update::kRegApField, L"2.0-dev");
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::UpdateInstallerStage(system_level, state_key_path,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      installer::BUILDING);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring value;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  .ReadValue(google_update::kRegApField, &value));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"2.0-dev-stage:building", value);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the stage.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey(root, state_key_path.c_str(), KEY_SET_VALUE)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WriteValue(google_update::kRegApField, L"2.0-dev-stage:building");
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::UpdateInstallerStage(system_level, state_key_path,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      installer::NO_STAGE);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring value;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  .ReadValue(google_update::kRegApField, &value));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(L"2.0-dev", value);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallUtilTest, UpdateInstallerStage) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool system_level = false;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring state_key_path(L"PhonyClientState");
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the stage when there's no "InstallerExtraCode1" value.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey(root, state_key_path.c_str(), KEY_SET_VALUE)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .DeleteValue(installer::kInstallerExtraCode1);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::UpdateInstallerStage(system_level, state_key_path,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      installer::BUILDING);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD value;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  .ReadValueDW(installer::kInstallerExtraCode1, &value));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(static_cast<DWORD>(installer::BUILDING), value);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the stage when there is an "InstallerExtraCode1" value.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey(root, state_key_path.c_str(), KEY_SET_VALUE)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WriteValue(installer::kInstallerExtraCode1,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    static_cast<DWORD>(installer::UNPACKING));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::UpdateInstallerStage(system_level, state_key_path,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      installer::BUILDING);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD value;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERROR_SUCCESS,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  .ReadValueDW(installer::kInstallerExtraCode1, &value));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(static_cast<DWORD>(installer::BUILDING), value);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the stage.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey(root, state_key_path.c_str(), KEY_SET_VALUE)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WriteValue(installer::kInstallerExtraCode1, static_cast<DWORD>(5));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::UpdateInstallerStage(system_level, state_key_path,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      installer::NO_STAGE);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD value;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERROR_FILE_NOT_FOUND,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RegKey(root, state_key_path.c_str(), KEY_QUERY_VALUE)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  .ReadValueDW(installer::kInstallerExtraCode1, &value));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallUtilTest, DeleteRegistryKeyIf) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HKEY root = HKEY_CURRENT_USER;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring parent_key_path(L"SomeKey\\ToDelete");
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring child_key_path(parent_key_path);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child_key_path.append(L"\\ChildKey\\WithAValue");
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t value_name[] = L"some_value_name";
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t value[] = L"hi mom";
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Nothing to delete if the keys aren't even there.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(_)).Times(0);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_FALSE(RegKey(root, parent_key_path.c_str(),
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE).Valid());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::NOT_FOUND,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryKeyIf(root, parent_key_path,
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 child_key_path,
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 WorkItem::kWow64Default,
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 value_name, pred));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(RegKey(root, parent_key_path.c_str(),
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE).Valid());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Parent exists, but not child: no delete.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(_)).Times(0);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(RegKey(root, parent_key_path.c_str(), KEY_SET_VALUE).Valid());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::NOT_FOUND,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryKeyIf(root, parent_key_path,
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 child_key_path,
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 WorkItem::kWow64Default,
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 value_name, pred));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, parent_key_path.c_str(),
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         KEY_QUERY_VALUE).Valid());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Child exists, but no value: no delete.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(_)).Times(0);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(RegKey(root, child_key_path.c_str(), KEY_SET_VALUE).Valid());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::NOT_FOUND,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryKeyIf(root, parent_key_path,
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 child_key_path,
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 WorkItem::kWow64Default,
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 value_name, pred));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, parent_key_path.c_str(),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         KEY_QUERY_VALUE).Valid());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Value exists, but doesn't match: no delete.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(StrEq(L"foosball!"))).WillOnce(Return(false));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RegKey(root, child_key_path.c_str(),
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       KEY_SET_VALUE).WriteValue(value_name, L"foosball!"));
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::NOT_FOUND,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryKeyIf(root, parent_key_path,
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 child_key_path,
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 WorkItem::kWow64Default,
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 value_name, pred));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, parent_key_path.c_str(),
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         KEY_QUERY_VALUE).Valid());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Value exists, and matches: delete.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RegKey(root, child_key_path.c_str(),
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       KEY_SET_VALUE).WriteValue(value_name, value));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::DELETED,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryKeyIf(root, parent_key_path,
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 child_key_path,
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 WorkItem::kWow64Default,
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 value_name, pred));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(RegKey(root, parent_key_path.c_str(),
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE).Valid());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default value exists and matches: delete.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RegKey(root, child_key_path.c_str(),
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       KEY_SET_VALUE).WriteValue(NULL, value));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::DELETED,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryKeyIf(root, parent_key_path,
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 child_key_path,
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 WorkItem::kWow64Default,
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 NULL, pred));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(RegKey(root, parent_key_path.c_str(),
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE).Valid());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallUtilTest, DeleteRegistryValueIf) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HKEY root = HKEY_CURRENT_USER;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring key_path(L"SomeKey\\ToDelete");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t value_name[] = L"some_value_name";
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t value[] = L"hi mom";
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Nothing to delete if the key isn't even there.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(_)).Times(0);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_FALSE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::NOT_FOUND,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(),
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   WorkItem::kWow64Default,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   value_name, pred));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Key exists, but no value: no delete.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(_)).Times(0);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(RegKey(root, key_path.c_str(), KEY_SET_VALUE).Valid());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::NOT_FOUND,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(),
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   WorkItem::kWow64Default,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   value_name, pred));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Value exists, but doesn't match: no delete.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(StrEq(L"foosball!"))).WillOnce(Return(false));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RegKey(root, key_path.c_str(),
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       KEY_SET_VALUE).WriteValue(value_name, L"foosball!"));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::NOT_FOUND,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(),
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   WorkItem::kWow64Default,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   value_name, pred));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, key_path.c_str(),
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         KEY_QUERY_VALUE).HasValue(value_name));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Value exists, and matches: delete.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RegKey(root, key_path.c_str(),
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       KEY_SET_VALUE).WriteValue(value_name, value));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::DELETED,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(),
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   WorkItem::kWow64Default,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   value_name, pred));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(RegKey(root, key_path.c_str(),
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE).HasValue(value_name));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default value matches: delete using empty string.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RegKey(root, key_path.c_str(),
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       KEY_SET_VALUE).WriteValue(L"", value));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::DELETED,
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(),
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   WorkItem::kWow64Default, L"",
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   pred));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid());
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(RegKey(root, key_path.c_str(),
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE).HasValue(L""));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegistryOverrideManager override_manager;
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    override_manager.OverrideRegistry(root);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default value matches: delete using NULL.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MockRegistryValuePredicate pred;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(pred, Evaluate(StrEq(value))).WillOnce(Return(true));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(ERROR_SUCCESS,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RegKey(root, key_path.c_str(),
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       KEY_SET_VALUE).WriteValue(L"", value));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(InstallUtil::DELETED,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                InstallUtil::DeleteRegistryValueIf(root, key_path.c_str(),
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   WorkItem::kWow64Default,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   NULL, pred));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(RegKey(root, key_path.c_str(), KEY_QUERY_VALUE).Valid());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(RegKey(root, key_path.c_str(),
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          KEY_QUERY_VALUE).HasValue(L""));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallUtilTest, ValueEquals) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallUtil::ValueEquals pred(L"howdy");
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pred.Evaluate(L""));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pred.Evaluate(L"Howdy"));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pred.Evaluate(L"howdy!"));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pred.Evaluate(L"!howdy"));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pred.Evaluate(L"howdy"));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InstallUtilTest, ProgramCompare) {
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath some_long_dir(
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_dir_.path().Append(L"Some Long Directory Name"));
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath expect(some_long_dir.Append(L"file.txt"));
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath expect_upcase(some_long_dir.Append(L"FILE.txt"));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath other(some_long_dir.Append(L"otherfile.txt"));
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests where the expected file doesn't exist.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paths don't match.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InstallUtil::ProgramCompare(expect).Evaluate(
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"\"" + other.value() + L"\""));
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paths match exactly.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InstallUtil::ProgramCompare(expect).Evaluate(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"\"" + expect.value() + L"\""));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paths differ by case.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InstallUtil::ProgramCompare(expect).Evaluate(
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"\"" + expect_upcase.value() + L"\""));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests where the expected file exists.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char data[] = "data";
432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(some_long_dir));
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NE(-1, base::WriteFile(expect, data, arraysize(data) - 1));
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paths don't match.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InstallUtil::ProgramCompare(expect).Evaluate(
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"\"" + other.value() + L"\""));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paths match exactly.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InstallUtil::ProgramCompare(expect).Evaluate(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"\"" + expect.value() + L"\""));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paths differ by case.
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InstallUtil::ProgramCompare(expect).Evaluate(
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"\"" + expect_upcase.value() + L"\""));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test where strings don't match, but the same file is indicated.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring short_expect;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD short_len = GetShortPathName(expect.value().c_str(),
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     WriteInto(&short_expect, MAX_PATH),
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     MAX_PATH);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<DWORD>(0), short_len);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(static_cast<DWORD>(MAX_PATH), short_len);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  short_expect.resize(short_len);
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(base::FilePath::CompareEqualIgnoreCase(expect.value(),
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      short_expect));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InstallUtil::ProgramCompare(expect).Evaluate(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"\"" + short_expect + L"\""));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
457