// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/installer/util/installation_state.h"
#include "base/strings/cstring_view.h"
#include "base/strings/strcat.h"
#include "base/test/test_reg_util_win.h"
#include "base/win/registry.h"
#include "chrome/installer/util/util_constants.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace installer {
class FindProductGuidTest : public ::testing::Test {
protected:
void SetUp() override {
ASSERT_NO_FATAL_FAILURE(
hklm_override_.OverrideRegistry(HKEY_LOCAL_MACHINE));
// Create Uninstall entries for two products.
base::win::RegKey uninstall(HKEY_LOCAL_MACHINE, kUninstallRootKey.c_str(),
KEY_CREATE_SUB_KEY);
ASSERT_TRUE(uninstall.Valid());
base::win::RegKey product1(
uninstall.Handle(), base::StrCat({L"{", kProductGuid1, L"}"}).c_str(),
KEY_SET_VALUE);
ASSERT_TRUE(product1.Valid());
ASSERT_EQ(product1.WriteValue(kUninstallDisplayNameField, L"FOOFOO"),
ERROR_SUCCESS);
base::win::RegKey product2(
uninstall.Handle(), base::StrCat({L"{", kProductGuid2, L"}"}).c_str(),
KEY_SET_VALUE);
ASSERT_TRUE(product2.Valid());
ASSERT_EQ(product2.WriteValue(kUninstallDisplayNameField, L"BARBAR"),
ERROR_SUCCESS);
}
static constexpr base::wcstring_view kUninstallRootKey{
L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"};
// A product named "FOOFOO".
static constexpr base::wcstring_view kProductGuid1{
L"410977A7-158D-327D-AEBC-66E5239FC916"};
// A product named "BARBAR".
static constexpr base::wcstring_view kProductGuid2{
L"510977A7-158D-327D-AEBC-66E5239FC916"};
private:
registry_util::RegistryOverrideManager hklm_override_;
};
// Tests that FindProductGuid works when no hint is provided.
TEST_F(FindProductGuidTest, WithoutHint) {
EXPECT_EQ(ProductState::FindProductGuid(L"FOOFOO", {}),
kProductGuid1.c_str());
EXPECT_EQ(ProductState::FindProductGuid(L"BARBAR", {}),
kProductGuid2.c_str());
}
// Tests that FindProductGuid works when a hint is provided to the desired item.
TEST_F(FindProductGuidTest, WithCorrectHint) {
EXPECT_EQ(ProductState::FindProductGuid(L"FOOFOO", kProductGuid1),
kProductGuid1.c_str());
EXPECT_EQ(ProductState::FindProductGuid(L"BARBAR", kProductGuid2),
kProductGuid2.c_str());
}
// Tests that FindProductGuid works when a hint is provided to the wrong item.
TEST_F(FindProductGuidTest, WithIncorrectHint) {
EXPECT_EQ(ProductState::FindProductGuid(L"FOOFOO", kProductGuid2),
kProductGuid1.c_str());
EXPECT_EQ(ProductState::FindProductGuid(L"BARBAR", kProductGuid1),
kProductGuid2.c_str());
}
} // namespace installer