blob: bba5c18e0d585fb1a15f3e18be1bb26f98671eaf [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
danakj51d26a42024-04-25 14:23:565#ifdef UNSAFE_BUFFERS_BUILD
6// TODO(crbug.com/40284755): Remove this and spanify to fix the errors.
7#pragma allow_unsafe_buffers
8#endif
9
fdoray5b7de9e92016-06-29 23:13:1110#include "base/file_version_info_win.h"
11
12#include <windows.h>
13
14#include <stddef.h>
15
16#include <memory>
17
18#include "base/file_version_info.h"
19#include "base/files/file_path.h"
fdoray5b7de9e92016-06-29 23:13:1120#include "base/path_service.h"
21#include "base/scoped_native_library.h"
jdoerrie5c4dc4e2019-02-01 18:02:3322#include "base/strings/string_util.h"
fdoray5b7de9e92016-06-29 23:13:1123#include "testing/gtest/include/gtest/gtest.h"
24
25using base::FilePath;
26
27namespace {
28
29FilePath GetTestDataPath() {
30 FilePath path;
Ho Cheung5ec9ef82023-10-25 20:41:5731 base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &path);
fdoray5b7de9e92016-06-29 23:13:1132 path = path.AppendASCII("base");
33 path = path.AppendASCII("test");
34 path = path.AppendASCII("data");
35 path = path.AppendASCII("file_version_info_unittest");
36 return path;
37}
38
39class FileVersionInfoFactory {
40 public:
41 explicit FileVersionInfoFactory(const FilePath& path) : path_(path) {}
David Bienvenub4b441e2020-09-23 05:49:5742 FileVersionInfoFactory(const FileVersionInfoFactory&) = delete;
43 FileVersionInfoFactory& operator=(const FileVersionInfoFactory&) = delete;
fdoray5b7de9e92016-06-29 23:13:1144
45 std::unique_ptr<FileVersionInfo> Create() const {
David Benjamin04cc2b42019-01-29 05:30:3346 return FileVersionInfo::CreateFileVersionInfo(path_);
fdoray5b7de9e92016-06-29 23:13:1147 }
48
49 private:
50 const FilePath path_;
fdoray5b7de9e92016-06-29 23:13:1151};
52
53class FileVersionInfoForModuleFactory {
54 public:
55 explicit FileVersionInfoForModuleFactory(const FilePath& path)
56 // Load the library with LOAD_LIBRARY_AS_IMAGE_RESOURCE since it shouldn't
57 // be executed.
Jan Wilken Dörrieb630aca2019-12-04 10:59:1158 : library_(::LoadLibraryEx(path.value().c_str(),
fdoray5b7de9e92016-06-29 23:13:1159 nullptr,
60 LOAD_LIBRARY_AS_IMAGE_RESOURCE)) {
61 EXPECT_TRUE(library_.is_valid());
62 }
David Bienvenub4b441e2020-09-23 05:49:5763 FileVersionInfoForModuleFactory(const FileVersionInfoForModuleFactory&) =
64 delete;
65 FileVersionInfoForModuleFactory& operator=(
66 const FileVersionInfoForModuleFactory&) = delete;
fdoray5b7de9e92016-06-29 23:13:1167
68 std::unique_ptr<FileVersionInfo> Create() const {
David Benjamin04cc2b42019-01-29 05:30:3369 return FileVersionInfo::CreateFileVersionInfoForModule(library_.get());
fdoray5b7de9e92016-06-29 23:13:1170 }
71
72 private:
73 const base::ScopedNativeLibrary library_;
fdoray5b7de9e92016-06-29 23:13:1174};
75
76template <typename T>
77class FileVersionInfoTest : public testing::Test {};
78
79using FileVersionInfoFactories =
80 ::testing::Types<FileVersionInfoFactory, FileVersionInfoForModuleFactory>;
81
82} // namespace
83
Victor Costanebc52732019-02-15 02:39:4784TYPED_TEST_SUITE(FileVersionInfoTest, FileVersionInfoFactories);
fdoray5b7de9e92016-06-29 23:13:1185
86TYPED_TEST(FileVersionInfoTest, HardCodedProperties) {
Jan Wilken Dörrieb630aca2019-12-04 10:59:1187 const base::FilePath::CharType kDLLName[] =
88 FILE_PATH_LITERAL("FileVersionInfoTest1.dll");
fdoray5b7de9e92016-06-29 23:13:1189
Jan Wilken Dörrieb630aca2019-12-04 10:59:1190 const wchar_t* const kExpectedValues[15] = {
fdoray5b7de9e92016-06-29 23:13:1191 // FileVersionInfoTest.dll
Jan Wilken Dörrieb630aca2019-12-04 10:59:1192 L"Goooooogle", // company_name
93 L"Google", // company_short_name
94 L"This is the product name", // product_name
95 L"This is the product short name", // product_short_name
96 L"The Internal Name", // internal_name
97 L"4.3.2.1", // product_version
98 L"Special build property", // special_build
99 L"This is the original filename", // original_filename
100 L"This is my file description", // file_description
101 L"1.2.3.4", // file_version
fdoray5b7de9e92016-06-29 23:13:11102 };
103
104 FilePath dll_path = GetTestDataPath();
105 dll_path = dll_path.Append(kDLLName);
106
107 TypeParam factory(dll_path);
108 std::unique_ptr<FileVersionInfo> version_info(factory.Create());
109 ASSERT_TRUE(version_info);
110
111 int j = 0;
Jan Wilken Dörrieb630aca2019-12-04 10:59:11112 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28113 base::AsWStringView(version_info->company_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11114 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28115 base::AsWStringView(version_info->company_short_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11116 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28117 base::AsWStringView(version_info->product_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11118 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28119 base::AsWStringView(version_info->product_short_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11120 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28121 base::AsWStringView(version_info->internal_name()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11122 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28123 base::AsWStringView(version_info->product_version()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11124 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28125 base::AsWStringView(version_info->special_build()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11126 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28127 base::AsWStringView(version_info->original_filename()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11128 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28129 base::AsWStringView(version_info->file_description()));
Jan Wilken Dörrieb630aca2019-12-04 10:59:11130 EXPECT_EQ(kExpectedValues[j++],
Lei Zhang692788372023-11-08 19:37:28131 base::AsWStringView(version_info->file_version()));
fdoray5b7de9e92016-06-29 23:13:11132}
133
134TYPED_TEST(FileVersionInfoTest, CustomProperties) {
135 FilePath dll_path = GetTestDataPath();
136 dll_path = dll_path.AppendASCII("FileVersionInfoTest1.dll");
137
138 TypeParam factory(dll_path);
139 std::unique_ptr<FileVersionInfo> version_info(factory.Create());
140 ASSERT_TRUE(version_info);
141
142 // Test few existing properties.
Jan Wilken Dörrie85285b02021-03-11 23:38:47143 std::u16string str;
fdoray5b7de9e92016-06-29 23:13:11144 FileVersionInfoWin* version_info_win =
145 static_cast<FileVersionInfoWin*>(version_info.get());
Jan Wilken Dörrie825776902021-03-04 20:28:35146 EXPECT_TRUE(version_info_win->GetValue(u"Custom prop 1", &str));
147 EXPECT_EQ(u"Un", str);
148 EXPECT_EQ(u"Un", version_info_win->GetStringValue(u"Custom prop 1"));
fdoray5b7de9e92016-06-29 23:13:11149
Jan Wilken Dörrie825776902021-03-04 20:28:35150 EXPECT_TRUE(version_info_win->GetValue(u"Custom prop 2", &str));
151 EXPECT_EQ(u"Deux", str);
152 EXPECT_EQ(u"Deux", version_info_win->GetStringValue(u"Custom prop 2"));
fdoray5b7de9e92016-06-29 23:13:11153
Jan Wilken Dörrie825776902021-03-04 20:28:35154 EXPECT_TRUE(version_info_win->GetValue(u"Custom prop 3", &str));
155 EXPECT_EQ(u"1600 Amphitheatre Parkway Mountain View, CA 94043", str);
156 EXPECT_EQ(u"1600 Amphitheatre Parkway Mountain View, CA 94043",
157 version_info_win->GetStringValue(u"Custom prop 3"));
fdoray5b7de9e92016-06-29 23:13:11158
159 // Test an non-existing property.
Jan Wilken Dörrie825776902021-03-04 20:28:35160 EXPECT_FALSE(version_info_win->GetValue(u"Unknown property", &str));
Jan Wilken Dörrie85285b02021-03-11 23:38:47161 EXPECT_EQ(std::u16string(),
Jan Wilken Dörrie825776902021-03-04 20:28:35162 version_info_win->GetStringValue(u"Unknown property"));
Alan Screene93de3a2019-10-02 13:56:09163
164 EXPECT_EQ(base::Version(std::vector<uint32_t>{1, 0, 0, 1}),
165 version_info_win->GetFileVersion());
fdoray5b7de9e92016-06-29 23:13:11166}
Lei Zhang16fa1acb2019-10-04 16:05:37167
168TYPED_TEST(FileVersionInfoTest, NoVersionInfo) {
169 FilePath dll_path = GetTestDataPath();
170 dll_path = dll_path.AppendASCII("no_version_info.dll");
171
172 TypeParam factory(dll_path);
173 ASSERT_FALSE(factory.Create());
174}