blob: 7d7d7aec0665310c0723e1e00fa6294b56f5c389 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2011 The Chromium Authors
fdoray5b7de9e92016-06-29 23:13:112// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/file_version_info_win.h"
6
7#include <windows.h>
8
9#include <stddef.h>
10
11#include <memory>
12
13#include "base/file_version_info.h"
14#include "base/files/file_path.h"
fdoray5b7de9e92016-06-29 23:13:1115#include "base/path_service.h"
16#include "base/scoped_native_library.h"
jdoerrie5c4dc4e2019-02-01 18:02:3317#include "base/strings/string_util.h"
fdoray5b7de9e92016-06-29 23:13:1118#include "testing/gtest/include/gtest/gtest.h"
19
20using base::FilePath;
21
22namespace {
23
24FilePath GetTestDataPath() {
25 FilePath path;
Ho Cheung5ec9ef82023-10-25 20:41:5726 base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &path);
fdoray5b7de9e92016-06-29 23:13:1127 path = path.AppendASCII("base");
28 path = path.AppendASCII("test");
29 path = path.AppendASCII("data");
30 path = path.AppendASCII("file_version_info_unittest");
31 return path;
32}
33
34class FileVersionInfoFactory {
35 public:
36 explicit FileVersionInfoFactory(const FilePath& path) : path_(path) {}
David Bienvenub4b441e2020-09-23 05:49:5737 FileVersionInfoFactory(const FileVersionInfoFactory&) = delete;
38 FileVersionInfoFactory& operator=(const FileVersionInfoFactory&) = delete;
fdoray5b7de9e92016-06-29 23:13:1139
40 std::unique_ptr<FileVersionInfo> Create() const {
David Benjamin04cc2b42019-01-29 05:30:3341 return FileVersionInfo::CreateFileVersionInfo(path_);
fdoray5b7de9e92016-06-29 23:13:1142 }
43
44 private:
45 const FilePath path_;
fdoray5b7de9e92016-06-29 23:13:1146};
47
48class FileVersionInfoForModuleFactory {
49 public:
50 explicit FileVersionInfoForModuleFactory(const FilePath& path)
51 // Load the library with LOAD_LIBRARY_AS_IMAGE_RESOURCE since it shouldn't
52 // be executed.
Jan Wilken Dörrieb630aca2019-12-04 10:59:1153 : library_(::LoadLibraryEx(path.value().c_str(),
fdoray5b7de9e92016-06-29 23:13:1154 nullptr,
55 LOAD_LIBRARY_AS_IMAGE_RESOURCE)) {
56 EXPECT_TRUE(library_.is_valid());
57 }
David Bienvenub4b441e2020-09-23 05:49:5758 FileVersionInfoForModuleFactory(const FileVersionInfoForModuleFactory&) =
59 delete;
60 FileVersionInfoForModuleFactory& operator=(
61 const FileVersionInfoForModuleFactory&) = delete;
fdoray5b7de9e92016-06-29 23:13:1162
63 std::unique_ptr<FileVersionInfo> Create() const {
David Benjamin04cc2b42019-01-29 05:30:3364 return FileVersionInfo::CreateFileVersionInfoForModule(library_.get());
fdoray5b7de9e92016-06-29 23:13:1165 }
66
67 private:
68 const base::ScopedNativeLibrary library_;
fdoray5b7de9e92016-06-29 23:13:1169};
70
71template <typename T>
72class FileVersionInfoTest : public testing::Test {};
73
74using FileVersionInfoFactories =
75 ::testing::Types<FileVersionInfoFactory, FileVersionInfoForModuleFactory>;
76
77} // namespace
78
Victor Costanebc52732019-02-15 02:39:4779TYPED_TEST_SUITE(FileVersionInfoTest, FileVersionInfoFactories);
fdoray5b7de9e92016-06-29 23:13:1180
81TYPED_TEST(FileVersionInfoTest, HardCodedProperties) {
Jan Wilken Dörrieb630aca2019-12-04 10:59:1182 const base::FilePath::CharType kDLLName[] =
83 FILE_PATH_LITERAL("FileVersionInfoTest1.dll");
fdoray5b7de9e92016-06-29 23:13:1184
Jan Wilken Dörrieb630aca2019-12-04 10:59:1185 const wchar_t* const kExpectedValues[15] = {
fdoray5b7de9e92016-06-29 23:13:1186 // FileVersionInfoTest.dll
Jan Wilken Dörrieb630aca2019-12-04 10:59:1187 L"Goooooogle", // company_name
88 L"Google", // company_short_name
89 L"This is the product name", // product_name
90 L"This is the product short name", // product_short_name
91 L"The Internal Name", // internal_name
92 L"4.3.2.1", // product_version
93 L"Special build property", // special_build
94 L"This is the original filename", // original_filename
95 L"This is my file description", // file_description
96 L"1.2.3.4", // file_version
fdoray5b7de9e92016-06-29 23:13:1197 };
98
99 FilePath dll_path = GetTestDataPath();
100 dll_path = dll_path.Append(kDLLName);
101
102 TypeParam factory(dll_path);
103 std::unique_ptr<FileVersionInfo> version_info(factory.Create());
104 ASSERT_TRUE(version_info);
105
106 int j = 0;
Jan Wilken Dörrieb630aca2019-12-04 10:59:11107 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28108 base::AsWStringView(version_info->company_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11109 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28110 base::AsWStringView(version_info->company_short_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11111 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28112 base::AsWStringView(version_info->product_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11113 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28114 base::AsWStringView(version_info->product_short_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11115 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28116 base::AsWStringView(version_info->internal_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11117 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28118 base::AsWStringView(version_info->product_version()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11119 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28120 base::AsWStringView(version_info->special_build()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11121 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28122 base::AsWStringView(version_info->original_filename()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11123 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28124 base::AsWStringView(version_info->file_description()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11125 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28126 base::AsWStringView(version_info->file_version()));
fdoray5b7de9e92016-06-29 23:13:11127}
128
129TYPED_TEST(FileVersionInfoTest, CustomProperties) {
130 FilePath dll_path = GetTestDataPath();
131 dll_path = dll_path.AppendASCII("FileVersionInfoTest1.dll");
132
133 TypeParam factory(dll_path);
134 std::unique_ptr<FileVersionInfo> version_info(factory.Create());
135 ASSERT_TRUE(version_info);
136
137 // Test few existing properties.
Jan Wilken Dörrie85285b02021-03-11 23:38:47138 std::u16string str;
fdoray5b7de9e92016-06-29 23:13:11139 FileVersionInfoWin* version_info_win =
140 static_cast<FileVersionInfoWin*>(version_info.get());
Jan Wilken Dörrie825776902021-03-04 20:28:35141 EXPECT_TRUE(version_info_win->GetValue(u"Custom prop 1", &str));
142 EXPECT_EQ(u"Un", str);
143 EXPECT_EQ(u"Un", version_info_win->GetStringValue(u"Custom prop 1"));
fdoray5b7de9e92016-06-29 23:13:11144
Jan Wilken Dörrie825776902021-03-04 20:28:35145 EXPECT_TRUE(version_info_win->GetValue(u"Custom prop 2", &str));
146 EXPECT_EQ(u"Deux", str);
147 EXPECT_EQ(u"Deux", version_info_win->GetStringValue(u"Custom prop 2"));
fdoray5b7de9e92016-06-29 23:13:11148
Jan Wilken Dörrie825776902021-03-04 20:28:35149 EXPECT_TRUE(version_info_win->GetValue(u"Custom prop 3", &str));
150 EXPECT_EQ(u"1600 Amphitheatre Parkway Mountain View, CA 94043", str);
151 EXPECT_EQ(u"1600 Amphitheatre Parkway Mountain View, CA 94043",
152 version_info_win->GetStringValue(u"Custom prop 3"));
fdoray5b7de9e92016-06-29 23:13:11153
154 // Test an non-existing property.
Jan Wilken Dörrie825776902021-03-04 20:28:35155 EXPECT_FALSE(version_info_win->GetValue(u"Unknown property", &str));
Jan Wilken Dörrie85285b02021-03-11 23:38:47156 EXPECT_EQ(std::u16string(),
Jan Wilken Dörrie825776902021-03-04 20:28:35157 version_info_win->GetStringValue(u"Unknown property"));
Alan Screene93de3a2019-10-02 13:56:09158
159 EXPECT_EQ(base::Version(std::vector<uint32_t>{1, 0, 0, 1}),
160 version_info_win->GetFileVersion());
fdoray5b7de9e92016-06-29 23:13:11161}
Lei Zhang16fa1acb2019-10-04 16:05:37162
163TYPED_TEST(FileVersionInfoTest, NoVersionInfo) {
164 FilePath dll_path = GetTestDataPath();
165 dll_path = dll_path.AppendASCII("no_version_info.dll");
166
167 TypeParam factory(dll_path);
168 ASSERT_FALSE(factory.Create());
169}