1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker // This file contains unit tests for PEImage.
6*6777b538SAndroid Build Coastguard Worker #include <algorithm>
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/path_service.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/scoped_native_library.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/win/pe_image.h"
12*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker namespace win {
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker namespace {
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Worker // Just counts the number of invocations.
ImportsCallback(const PEImage & image,LPCSTR module,DWORD ordinal,LPCSTR name,DWORD hint,PIMAGE_THUNK_DATA iat,PVOID cookie)21*6777b538SAndroid Build Coastguard Worker bool ImportsCallback(const PEImage& image,
22*6777b538SAndroid Build Coastguard Worker LPCSTR module,
23*6777b538SAndroid Build Coastguard Worker DWORD ordinal,
24*6777b538SAndroid Build Coastguard Worker LPCSTR name,
25*6777b538SAndroid Build Coastguard Worker DWORD hint,
26*6777b538SAndroid Build Coastguard Worker PIMAGE_THUNK_DATA iat,
27*6777b538SAndroid Build Coastguard Worker PVOID cookie) {
28*6777b538SAndroid Build Coastguard Worker int* count = reinterpret_cast<int*>(cookie);
29*6777b538SAndroid Build Coastguard Worker (*count)++;
30*6777b538SAndroid Build Coastguard Worker return true;
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker // Just counts the number of invocations.
SectionsCallback(const PEImage & image,PIMAGE_SECTION_HEADER header,PVOID section_start,DWORD section_size,PVOID cookie)34*6777b538SAndroid Build Coastguard Worker bool SectionsCallback(const PEImage& image,
35*6777b538SAndroid Build Coastguard Worker PIMAGE_SECTION_HEADER header,
36*6777b538SAndroid Build Coastguard Worker PVOID section_start,
37*6777b538SAndroid Build Coastguard Worker DWORD section_size,
38*6777b538SAndroid Build Coastguard Worker PVOID cookie) {
39*6777b538SAndroid Build Coastguard Worker int* count = reinterpret_cast<int*>(cookie);
40*6777b538SAndroid Build Coastguard Worker (*count)++;
41*6777b538SAndroid Build Coastguard Worker return true;
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker // Just counts the number of invocations.
RelocsCallback(const PEImage & image,WORD type,PVOID address,PVOID cookie)45*6777b538SAndroid Build Coastguard Worker bool RelocsCallback(const PEImage& image,
46*6777b538SAndroid Build Coastguard Worker WORD type,
47*6777b538SAndroid Build Coastguard Worker PVOID address,
48*6777b538SAndroid Build Coastguard Worker PVOID cookie) {
49*6777b538SAndroid Build Coastguard Worker int* count = reinterpret_cast<int*>(cookie);
50*6777b538SAndroid Build Coastguard Worker (*count)++;
51*6777b538SAndroid Build Coastguard Worker return true;
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker // Just counts the number of invocations.
ImportChunksCallback(const PEImage & image,LPCSTR module,PIMAGE_THUNK_DATA name_table,PIMAGE_THUNK_DATA iat,PVOID cookie)55*6777b538SAndroid Build Coastguard Worker bool ImportChunksCallback(const PEImage& image,
56*6777b538SAndroid Build Coastguard Worker LPCSTR module,
57*6777b538SAndroid Build Coastguard Worker PIMAGE_THUNK_DATA name_table,
58*6777b538SAndroid Build Coastguard Worker PIMAGE_THUNK_DATA iat,
59*6777b538SAndroid Build Coastguard Worker PVOID cookie) {
60*6777b538SAndroid Build Coastguard Worker int* count = reinterpret_cast<int*>(cookie);
61*6777b538SAndroid Build Coastguard Worker (*count)++;
62*6777b538SAndroid Build Coastguard Worker return true;
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker // Just counts the number of invocations.
DelayImportChunksCallback(const PEImage & image,PImgDelayDescr delay_descriptor,LPCSTR module,PIMAGE_THUNK_DATA name_table,PIMAGE_THUNK_DATA iat,PVOID cookie)66*6777b538SAndroid Build Coastguard Worker bool DelayImportChunksCallback(const PEImage& image,
67*6777b538SAndroid Build Coastguard Worker PImgDelayDescr delay_descriptor,
68*6777b538SAndroid Build Coastguard Worker LPCSTR module,
69*6777b538SAndroid Build Coastguard Worker PIMAGE_THUNK_DATA name_table,
70*6777b538SAndroid Build Coastguard Worker PIMAGE_THUNK_DATA iat,
71*6777b538SAndroid Build Coastguard Worker PVOID cookie) {
72*6777b538SAndroid Build Coastguard Worker int* count = reinterpret_cast<int*>(cookie);
73*6777b538SAndroid Build Coastguard Worker (*count)++;
74*6777b538SAndroid Build Coastguard Worker return true;
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker // Just counts the number of invocations.
ExportsCallback(const PEImage & image,DWORD ordinal,DWORD hint,LPCSTR name,PVOID function,LPCSTR forward,PVOID cookie)78*6777b538SAndroid Build Coastguard Worker bool ExportsCallback(const PEImage& image,
79*6777b538SAndroid Build Coastguard Worker DWORD ordinal,
80*6777b538SAndroid Build Coastguard Worker DWORD hint,
81*6777b538SAndroid Build Coastguard Worker LPCSTR name,
82*6777b538SAndroid Build Coastguard Worker PVOID function,
83*6777b538SAndroid Build Coastguard Worker LPCSTR forward,
84*6777b538SAndroid Build Coastguard Worker PVOID cookie) {
85*6777b538SAndroid Build Coastguard Worker int* count = reinterpret_cast<int*>(cookie);
86*6777b538SAndroid Build Coastguard Worker (*count)++;
87*6777b538SAndroid Build Coastguard Worker return true;
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker
GetPEImageTestPath()90*6777b538SAndroid Build Coastguard Worker base::FilePath GetPEImageTestPath() {
91*6777b538SAndroid Build Coastguard Worker base::FilePath pe_image_test_path;
92*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathService::Get(DIR_TEST_DATA, &pe_image_test_path));
93*6777b538SAndroid Build Coastguard Worker pe_image_test_path = pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image"));
94*6777b538SAndroid Build Coastguard Worker #if defined(ARCH_CPU_ARM64)
95*6777b538SAndroid Build Coastguard Worker pe_image_test_path =
96*6777b538SAndroid Build Coastguard Worker pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_arm64.dll"));
97*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_X86_64)
98*6777b538SAndroid Build Coastguard Worker pe_image_test_path =
99*6777b538SAndroid Build Coastguard Worker pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_64.dll"));
100*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_X86)
101*6777b538SAndroid Build Coastguard Worker pe_image_test_path =
102*6777b538SAndroid Build Coastguard Worker pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_32.dll"));
103*6777b538SAndroid Build Coastguard Worker #else
104*6777b538SAndroid Build Coastguard Worker #error This platform is not supported.
105*6777b538SAndroid Build Coastguard Worker #endif
106*6777b538SAndroid Build Coastguard Worker return pe_image_test_path;
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard Worker } // namespace
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker // Tests that we are able to enumerate stuff from a PE file, and that
112*6777b538SAndroid Build Coastguard Worker // the actual number of items found matches an expected value.
TEST(PEImageTest,EnumeratesPE)113*6777b538SAndroid Build Coastguard Worker TEST(PEImageTest, EnumeratesPE) {
114*6777b538SAndroid Build Coastguard Worker base::FilePath pe_image_test_path = GetPEImageTestPath();
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker #if defined(ARCH_CPU_ARM64)
117*6777b538SAndroid Build Coastguard Worker const int kSections = 7;
118*6777b538SAndroid Build Coastguard Worker const int kImportsDlls = 3;
119*6777b538SAndroid Build Coastguard Worker const int kDelayDlls = 2;
120*6777b538SAndroid Build Coastguard Worker const int kExports = 3;
121*6777b538SAndroid Build Coastguard Worker const int kImports = 72;
122*6777b538SAndroid Build Coastguard Worker const int kDelayImports = 2;
123*6777b538SAndroid Build Coastguard Worker const int kRelocs = 740;
124*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_64_BITS)
125*6777b538SAndroid Build Coastguard Worker const int kSections = 6;
126*6777b538SAndroid Build Coastguard Worker const int kImportsDlls = 2;
127*6777b538SAndroid Build Coastguard Worker const int kDelayDlls = 2;
128*6777b538SAndroid Build Coastguard Worker const int kExports = 3;
129*6777b538SAndroid Build Coastguard Worker const int kImports = 70;
130*6777b538SAndroid Build Coastguard Worker const int kDelayImports = 2;
131*6777b538SAndroid Build Coastguard Worker const int kRelocs = 976;
132*6777b538SAndroid Build Coastguard Worker #else
133*6777b538SAndroid Build Coastguard Worker const int kSections = 5;
134*6777b538SAndroid Build Coastguard Worker const int kImportsDlls = 2;
135*6777b538SAndroid Build Coastguard Worker const int kDelayDlls = 2;
136*6777b538SAndroid Build Coastguard Worker const int kExports = 3;
137*6777b538SAndroid Build Coastguard Worker const int kImports = 66;
138*6777b538SAndroid Build Coastguard Worker const int kDelayImports = 2;
139*6777b538SAndroid Build Coastguard Worker const int kRelocs = 2114;
140*6777b538SAndroid Build Coastguard Worker #endif
141*6777b538SAndroid Build Coastguard Worker
142*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary module(pe_image_test_path);
143*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(module.is_valid());
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard Worker PEImage pe(module.get());
146*6777b538SAndroid Build Coastguard Worker int count = 0;
147*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(pe.VerifyMagic());
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker pe.EnumSections(SectionsCallback, &count);
150*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kSections, count);
151*6777b538SAndroid Build Coastguard Worker
152*6777b538SAndroid Build Coastguard Worker count = 0;
153*6777b538SAndroid Build Coastguard Worker pe.EnumImportChunks(ImportChunksCallback, &count, nullptr);
154*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kImportsDlls, count);
155*6777b538SAndroid Build Coastguard Worker
156*6777b538SAndroid Build Coastguard Worker count = 0;
157*6777b538SAndroid Build Coastguard Worker pe.EnumDelayImportChunks(DelayImportChunksCallback, &count, nullptr);
158*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kDelayDlls, count);
159*6777b538SAndroid Build Coastguard Worker
160*6777b538SAndroid Build Coastguard Worker count = 0;
161*6777b538SAndroid Build Coastguard Worker pe.EnumExports(ExportsCallback, &count);
162*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExports, count);
163*6777b538SAndroid Build Coastguard Worker
164*6777b538SAndroid Build Coastguard Worker count = 0;
165*6777b538SAndroid Build Coastguard Worker pe.EnumAllImports(ImportsCallback, &count, nullptr);
166*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kImports, count);
167*6777b538SAndroid Build Coastguard Worker
168*6777b538SAndroid Build Coastguard Worker count = 0;
169*6777b538SAndroid Build Coastguard Worker pe.EnumAllDelayImports(ImportsCallback, &count, nullptr);
170*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kDelayImports, count);
171*6777b538SAndroid Build Coastguard Worker
172*6777b538SAndroid Build Coastguard Worker count = 0;
173*6777b538SAndroid Build Coastguard Worker pe.EnumRelocs(RelocsCallback, &count);
174*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kRelocs, count);
175*6777b538SAndroid Build Coastguard Worker }
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker // Tests that we are able to enumerate stuff from a PE file, and that
178*6777b538SAndroid Build Coastguard Worker // the actual number of items found matches an expected value.
TEST(PEImageTest,EnumeratesPEWithTargetModule)179*6777b538SAndroid Build Coastguard Worker TEST(PEImageTest, EnumeratesPEWithTargetModule) {
180*6777b538SAndroid Build Coastguard Worker base::FilePath pe_image_test_path = GetPEImageTestPath();
181*6777b538SAndroid Build Coastguard Worker const char kTargetModuleStatic[] = "user32.dll";
182*6777b538SAndroid Build Coastguard Worker const char kTargetModuleDelay[] = "cfgmgr32.dll";
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard Worker const int kImportsDlls = 1;
185*6777b538SAndroid Build Coastguard Worker const int kDelayDlls = 1;
186*6777b538SAndroid Build Coastguard Worker const int kExports = 3;
187*6777b538SAndroid Build Coastguard Worker const int kImports = 2;
188*6777b538SAndroid Build Coastguard Worker const int kDelayImports = 1;
189*6777b538SAndroid Build Coastguard Worker #if defined(ARCH_CPU_ARM64)
190*6777b538SAndroid Build Coastguard Worker const int kSections = 7;
191*6777b538SAndroid Build Coastguard Worker const int kRelocs = 740;
192*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_64_BITS)
193*6777b538SAndroid Build Coastguard Worker const int kSections = 6;
194*6777b538SAndroid Build Coastguard Worker const int kRelocs = 976;
195*6777b538SAndroid Build Coastguard Worker #else
196*6777b538SAndroid Build Coastguard Worker const int kSections = 5;
197*6777b538SAndroid Build Coastguard Worker const int kRelocs = 2114;
198*6777b538SAndroid Build Coastguard Worker #endif
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary module(pe_image_test_path);
201*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(module.is_valid());
202*6777b538SAndroid Build Coastguard Worker
203*6777b538SAndroid Build Coastguard Worker PEImage pe(module.get());
204*6777b538SAndroid Build Coastguard Worker int count = 0;
205*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(pe.VerifyMagic());
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Worker pe.EnumSections(SectionsCallback, &count);
208*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kSections, count);
209*6777b538SAndroid Build Coastguard Worker
210*6777b538SAndroid Build Coastguard Worker count = 0;
211*6777b538SAndroid Build Coastguard Worker pe.EnumImportChunks(ImportChunksCallback, &count, kTargetModuleStatic);
212*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kImportsDlls, count);
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard Worker count = 0;
215*6777b538SAndroid Build Coastguard Worker pe.EnumDelayImportChunks(DelayImportChunksCallback, &count,
216*6777b538SAndroid Build Coastguard Worker kTargetModuleDelay);
217*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kDelayDlls, count);
218*6777b538SAndroid Build Coastguard Worker
219*6777b538SAndroid Build Coastguard Worker count = 0;
220*6777b538SAndroid Build Coastguard Worker pe.EnumExports(ExportsCallback, &count);
221*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExports, count);
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Worker count = 0;
224*6777b538SAndroid Build Coastguard Worker pe.EnumAllImports(ImportsCallback, &count, kTargetModuleStatic);
225*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kImports, count);
226*6777b538SAndroid Build Coastguard Worker
227*6777b538SAndroid Build Coastguard Worker count = 0;
228*6777b538SAndroid Build Coastguard Worker pe.EnumAllDelayImports(ImportsCallback, &count, kTargetModuleDelay);
229*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kDelayImports, count);
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Worker count = 0;
232*6777b538SAndroid Build Coastguard Worker pe.EnumRelocs(RelocsCallback, &count);
233*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kRelocs, count);
234*6777b538SAndroid Build Coastguard Worker }
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker // Tests that we can locate an specific exported symbol, by name and by ordinal.
TEST(PEImageTest,RetrievesExports)237*6777b538SAndroid Build Coastguard Worker TEST(PEImageTest, RetrievesExports) {
238*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary module(FilePath(FILE_PATH_LITERAL("advapi32.dll")));
239*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(module.is_valid());
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard Worker PEImage pe(module.get());
242*6777b538SAndroid Build Coastguard Worker WORD ordinal;
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(pe.GetProcOrdinal("RegEnumKeyExW", &ordinal));
245*6777b538SAndroid Build Coastguard Worker
246*6777b538SAndroid Build Coastguard Worker FARPROC address1 = pe.GetProcAddress("RegEnumKeyExW");
247*6777b538SAndroid Build Coastguard Worker FARPROC address2 = pe.GetProcAddress(reinterpret_cast<char*>(ordinal));
248*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(address1 != nullptr);
249*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(address2 != nullptr);
250*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(address1 == address2);
251*6777b538SAndroid Build Coastguard Worker }
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker // Tests that we can locate a forwarded export.
TEST(PEImageTest,ForwardedExport)254*6777b538SAndroid Build Coastguard Worker TEST(PEImageTest, ForwardedExport) {
255*6777b538SAndroid Build Coastguard Worker base::FilePath pe_image_test_path = GetPEImageTestPath();
256*6777b538SAndroid Build Coastguard Worker
257*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary module(pe_image_test_path);
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(module.is_valid());
260*6777b538SAndroid Build Coastguard Worker
261*6777b538SAndroid Build Coastguard Worker PEImage pe(module.get());
262*6777b538SAndroid Build Coastguard Worker
263*6777b538SAndroid Build Coastguard Worker FARPROC addr = pe.GetProcAddress("FwdExport");
264*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(FARPROC(-1), addr);
265*6777b538SAndroid Build Coastguard Worker
266*6777b538SAndroid Build Coastguard Worker PDWORD export_entry = pe.GetExportEntry("FwdExport");
267*6777b538SAndroid Build Coastguard Worker EXPECT_NE(nullptr, export_entry);
268*6777b538SAndroid Build Coastguard Worker PVOID fwd_addr = pe.RVAToAddr(*export_entry);
269*6777b538SAndroid Build Coastguard Worker const char expected_fwd[] = "KERNEL32.CreateFileA";
270*6777b538SAndroid Build Coastguard Worker EXPECT_STREQ(expected_fwd, reinterpret_cast<char*>(fwd_addr));
271*6777b538SAndroid Build Coastguard Worker }
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker // Test that we can get debug id out of a module.
TEST(PEImageTest,GetDebugId)274*6777b538SAndroid Build Coastguard Worker TEST(PEImageTest, GetDebugId) {
275*6777b538SAndroid Build Coastguard Worker static constexpr char kPdbFileName[] = "advapi32.pdb";
276*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary module(FilePath(FILE_PATH_LITERAL("advapi32.dll")));
277*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(module.is_valid());
278*6777b538SAndroid Build Coastguard Worker
279*6777b538SAndroid Build Coastguard Worker PEImage pe(module.get());
280*6777b538SAndroid Build Coastguard Worker GUID guid = {0};
281*6777b538SAndroid Build Coastguard Worker DWORD age = 0;
282*6777b538SAndroid Build Coastguard Worker LPCSTR pdb_file = nullptr;
283*6777b538SAndroid Build Coastguard Worker size_t pdb_file_length = 0;
284*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(pe.GetDebugId(&guid, &age, &pdb_file, &pdb_file_length));
285*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(pdb_file_length, strlen(kPdbFileName));
286*6777b538SAndroid Build Coastguard Worker EXPECT_STREQ(pdb_file, kPdbFileName);
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker // Should be valid to call without parameters.
289*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(pe.GetDebugId(nullptr, nullptr, nullptr, nullptr));
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Worker GUID empty_guid = {0};
292*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(!IsEqualGUID(empty_guid, guid));
293*6777b538SAndroid Build Coastguard Worker EXPECT_NE(0U, age);
294*6777b538SAndroid Build Coastguard Worker }
295*6777b538SAndroid Build Coastguard Worker
296*6777b538SAndroid Build Coastguard Worker } // namespace win
297*6777b538SAndroid Build Coastguard Worker } // namespace base
298