Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: src/common/linux/file_id_unittest.cc

Issue 1688743002: Switch the Linux minidump writer to use MDCVInfoELF for CV data. (Closed) Base URL: https://chromium.googlesource.com/breakpad/breakpad.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/common/linux/file_id.h ('K') | « src/common/linux/file_id.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010, Google Inc. 1 // Copyright (c) 2010, Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 AutoTempDir temp_dir; 80 AutoTempDir temp_dir;
81 string templ = temp_dir.path() + "/file-id-unittest"; 81 string templ = temp_dir.path() + "/file-id-unittest";
82 char cmdline[4096]; 82 char cmdline[4096];
83 sprintf(cmdline, "cp \"%s\" \"%s\"", exe_name, templ.c_str()); 83 sprintf(cmdline, "cp \"%s\" \"%s\"", exe_name, templ.c_str());
84 ASSERT_EQ(0, system(cmdline)) << "Failed to execute: " << cmdline; 84 ASSERT_EQ(0, system(cmdline)) << "Failed to execute: " << cmdline;
85 sprintf(cmdline, "chmod u+w \"%s\"", templ.c_str()); 85 sprintf(cmdline, "chmod u+w \"%s\"", templ.c_str());
86 ASSERT_EQ(0, system(cmdline)) << "Failed to execute: " << cmdline; 86 ASSERT_EQ(0, system(cmdline)) << "Failed to execute: " << cmdline;
87 sprintf(cmdline, "strip \"%s\"", templ.c_str()); 87 sprintf(cmdline, "strip \"%s\"", templ.c_str());
88 ASSERT_EQ(0, system(cmdline)) << "Failed to execute: " << cmdline; 88 ASSERT_EQ(0, system(cmdline)) << "Failed to execute: " << cmdline;
89 89
90 uint8_t identifier1[sizeof(MDGUID)]; 90 uint8_t identifier1[kMaxBuildID];
91 uint8_t identifier2[sizeof(MDGUID)]; 91 size_t identifier1_length;
92 uint8_t identifier2[kMaxBuildID];
93 size_t identifier2_length;
92 FileID fileid1(exe_name); 94 FileID fileid1(exe_name);
93 EXPECT_TRUE(fileid1.ElfFileIdentifier(identifier1)); 95 EXPECT_TRUE(fileid1.ElfFileIdentifier(identifier1, &identifier1_length));
94 FileID fileid2(templ.c_str()); 96 FileID fileid2(templ.c_str());
95 EXPECT_TRUE(fileid2.ElfFileIdentifier(identifier2)); 97 EXPECT_TRUE(fileid2.ElfFileIdentifier(identifier2, &identifier2_length));
96 char identifier_string1[37]; 98 char identifier_string1[37];
97 char identifier_string2[37]; 99 char identifier_string2[37];
98 FileID::ConvertIdentifierToString(identifier1, identifier_string1, 100 FileID::ConvertIdentifierToString(identifier1, identifier_string1,
99 37); 101 37);
100 FileID::ConvertIdentifierToString(identifier2, identifier_string2, 102 FileID::ConvertIdentifierToString(identifier2, identifier_string2,
101 37); 103 37);
102 EXPECT_STREQ(identifier_string1, identifier_string2); 104 EXPECT_STREQ(identifier_string1, identifier_string2);
103 } 105 }
104 #endif // !__ANDROID__ 106 #endif // !__ANDROID__
105 107
(...skipping 12 matching lines...) Expand all
118 120
119 vector<uint8_t> elfdata_v; 121 vector<uint8_t> elfdata_v;
120 uint8_t* elfdata; 122 uint8_t* elfdata;
121 }; 123 };
122 124
123 typedef Types<ElfClass32, ElfClass64> ElfClasses; 125 typedef Types<ElfClass32, ElfClass64> ElfClasses;
124 126
125 TYPED_TEST_CASE(FileIDTest, ElfClasses); 127 TYPED_TEST_CASE(FileIDTest, ElfClasses);
126 128
127 TYPED_TEST(FileIDTest, ElfClass) { 129 TYPED_TEST(FileIDTest, ElfClass) {
128 uint8_t identifier[sizeof(MDGUID)]; 130 uint8_t identifier[kMaxBuildID];
131 size_t identifier_length;
129 const char expected_identifier_string[] = 132 const char expected_identifier_string[] =
130 "80808080-8080-0000-0000-008080808080"; 133 "80808080-8080-0000-0000-008080808080";
131 char identifier_string[sizeof(expected_identifier_string)]; 134 char identifier_string[sizeof(expected_identifier_string)];
132 const size_t kTextSectionSize = 128; 135 const size_t kTextSectionSize = 128;
133 136
134 ELF elf(EM_386, TypeParam::kClass, kLittleEndian); 137 ELF elf(EM_386, TypeParam::kClass, kLittleEndian);
135 Section text(kLittleEndian); 138 Section text(kLittleEndian);
136 for (size_t i = 0; i < kTextSectionSize; ++i) { 139 for (size_t i = 0; i < kTextSectionSize; ++i) {
137 text.D8(i * 3); 140 text.D8(i * 3);
138 } 141 }
139 elf.AddSection(".text", text, SHT_PROGBITS); 142 elf.AddSection(".text", text, SHT_PROGBITS);
140 elf.Finish(); 143 elf.Finish();
141 this->GetElfContents(elf); 144 this->GetElfContents(elf);
142 145
143 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, 146 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
144 identifier)); 147 identifier,
148 &identifier_length));
145 149
146 FileID::ConvertIdentifierToString(identifier, identifier_string, 150 FileID::ConvertIdentifierToString(identifier, identifier_string,
147 sizeof(identifier_string)); 151 sizeof(identifier_string));
148 EXPECT_STREQ(expected_identifier_string, identifier_string); 152 EXPECT_STREQ(expected_identifier_string, identifier_string);
149 } 153 }
150 154
151 TYPED_TEST(FileIDTest, BuildID) { 155 TYPED_TEST(FileIDTest, BuildID) {
152 const uint8_t kExpectedIdentifier[sizeof(MDGUID)] = 156 const uint8_t kExpectedIdentifier[kMaxBuildID] =
153 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 157 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
154 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; 158 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
159 0x10, 0x11, 0x12, 0x13};
155 char expected_identifier_string[] = 160 char expected_identifier_string[] =
156 "00000000-0000-0000-0000-000000000000"; 161 "00000000-0000-0000-0000-000000000000";
157 FileID::ConvertIdentifierToString(kExpectedIdentifier, 162 FileID::ConvertIdentifierToString(kExpectedIdentifier,
158 expected_identifier_string, 163 expected_identifier_string,
159 sizeof(expected_identifier_string)); 164 sizeof(expected_identifier_string));
160 165
161 uint8_t identifier[sizeof(MDGUID)]; 166 uint8_t identifier[kMaxBuildID];
167 size_t identifier_length;
162 char identifier_string[sizeof(expected_identifier_string)]; 168 char identifier_string[sizeof(expected_identifier_string)];
163 169
164 ELF elf(EM_386, TypeParam::kClass, kLittleEndian); 170 ELF elf(EM_386, TypeParam::kClass, kLittleEndian);
165 Section text(kLittleEndian); 171 Section text(kLittleEndian);
166 text.Append(4096, 0); 172 text.Append(4096, 0);
167 elf.AddSection(".text", text, SHT_PROGBITS); 173 elf.AddSection(".text", text, SHT_PROGBITS);
168 Notes notes(kLittleEndian); 174 Notes notes(kLittleEndian);
169 notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifier, 175 notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifier,
170 sizeof(kExpectedIdentifier)); 176 sizeof(kExpectedIdentifier));
171 elf.AddSection(".note.gnu.build-id", notes, SHT_NOTE); 177 elf.AddSection(".note.gnu.build-id", notes, SHT_NOTE);
172 elf.Finish(); 178 elf.Finish();
173 this->GetElfContents(elf); 179 this->GetElfContents(elf);
174 180
175 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, 181 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
176 identifier)); 182 identifier,
183 &identifier_length));
184 EXPECT_EQ(sizeof(kExpectedIdentifier), identifier_length);
177 185
178 FileID::ConvertIdentifierToString(identifier, identifier_string, 186 FileID::ConvertIdentifierToString(identifier, identifier_string,
179 sizeof(identifier_string)); 187 sizeof(identifier_string));
180 EXPECT_STREQ(expected_identifier_string, identifier_string); 188 EXPECT_STREQ(expected_identifier_string, identifier_string);
181 } 189 }
182 190
183 TYPED_TEST(FileIDTest, BuildIDPH) { 191 TYPED_TEST(FileIDTest, BuildIDPH) {
184 const uint8_t kExpectedIdentifier[sizeof(MDGUID)] = 192 const uint8_t kExpectedIdentifier[kMaxBuildID] =
185 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 193 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
186 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; 194 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
195 0x10, 0x11, 0x12, 0x13};
187 char expected_identifier_string[] = 196 char expected_identifier_string[] =
188 "00000000-0000-0000-0000-000000000000"; 197 "00000000-0000-0000-0000-000000000000";
189 FileID::ConvertIdentifierToString(kExpectedIdentifier, 198 FileID::ConvertIdentifierToString(kExpectedIdentifier,
190 expected_identifier_string, 199 expected_identifier_string,
191 sizeof(expected_identifier_string)); 200 sizeof(expected_identifier_string));
192 201
193 uint8_t identifier[sizeof(MDGUID)]; 202 uint8_t identifier[kMaxBuildID];
203 size_t identifier_length;
194 char identifier_string[sizeof(expected_identifier_string)]; 204 char identifier_string[sizeof(expected_identifier_string)];
195 205
196 ELF elf(EM_386, TypeParam::kClass, kLittleEndian); 206 ELF elf(EM_386, TypeParam::kClass, kLittleEndian);
197 Section text(kLittleEndian); 207 Section text(kLittleEndian);
198 text.Append(4096, 0); 208 text.Append(4096, 0);
199 elf.AddSection(".text", text, SHT_PROGBITS); 209 elf.AddSection(".text", text, SHT_PROGBITS);
200 Notes notes(kLittleEndian); 210 Notes notes(kLittleEndian);
201 notes.AddNote(0, "Linux", 211 notes.AddNote(0, "Linux",
202 reinterpret_cast<const uint8_t *>("\0x42\0x02\0\0"), 4); 212 reinterpret_cast<const uint8_t *>("\0x42\0x02\0\0"), 4);
203 notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifier, 213 notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifier,
204 sizeof(kExpectedIdentifier)); 214 sizeof(kExpectedIdentifier));
205 int note_idx = elf.AddSection(".note", notes, SHT_NOTE); 215 int note_idx = elf.AddSection(".note", notes, SHT_NOTE);
206 elf.AddSegment(note_idx, note_idx, PT_NOTE); 216 elf.AddSegment(note_idx, note_idx, PT_NOTE);
207 elf.Finish(); 217 elf.Finish();
208 this->GetElfContents(elf); 218 this->GetElfContents(elf);
209 219
210 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, 220 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
211 identifier)); 221 identifier,
222 &identifier_length));
223 EXPECT_EQ(sizeof(kExpectedIdentifier), identifier_length);
212 224
213 FileID::ConvertIdentifierToString(identifier, identifier_string, 225 FileID::ConvertIdentifierToString(identifier, identifier_string,
214 sizeof(identifier_string)); 226 sizeof(identifier_string));
215 EXPECT_STREQ(expected_identifier_string, identifier_string); 227 EXPECT_STREQ(expected_identifier_string, identifier_string);
216 } 228 }
217 229
218 // Test to make sure two files with different text sections produce 230 // Test to make sure two files with different text sections produce
219 // different hashes when not using a build id. 231 // different hashes when not using a build id.
220 TYPED_TEST(FileIDTest, UniqueHashes) { 232 TYPED_TEST(FileIDTest, UniqueHashes) {
221 char identifier_string_1[] = 233 char identifier_string_1[] =
222 "00000000-0000-0000-0000-000000000000"; 234 "00000000-0000-0000-0000-000000000000";
223 char identifier_string_2[] = 235 char identifier_string_2[] =
224 "00000000-0000-0000-0000-000000000000"; 236 "00000000-0000-0000-0000-000000000000";
225 uint8_t identifier_1[sizeof(MDGUID)]; 237 uint8_t identifier_1[kMaxBuildID];
226 uint8_t identifier_2[sizeof(MDGUID)]; 238 size_t identifier_1_size;
239 uint8_t identifier_2[kMaxBuildID];
240 size_t identifier_2_size;
227 241
228 { 242 {
229 ELF elf1(EM_386, TypeParam::kClass, kLittleEndian); 243 ELF elf1(EM_386, TypeParam::kClass, kLittleEndian);
230 Section foo_1(kLittleEndian); 244 Section foo_1(kLittleEndian);
231 PopulateSection(&foo_1, 32, 5); 245 PopulateSection(&foo_1, 32, 5);
232 elf1.AddSection(".foo", foo_1, SHT_PROGBITS); 246 elf1.AddSection(".foo", foo_1, SHT_PROGBITS);
233 Section text_1(kLittleEndian); 247 Section text_1(kLittleEndian);
234 PopulateSection(&text_1, 4096, 17); 248 PopulateSection(&text_1, 4096, 17);
235 elf1.AddSection(".text", text_1, SHT_PROGBITS); 249 elf1.AddSection(".text", text_1, SHT_PROGBITS);
236 elf1.Finish(); 250 elf1.Finish();
237 this->GetElfContents(elf1); 251 this->GetElfContents(elf1);
238 } 252 }
239 253
240 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, 254 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
241 identifier_1)); 255 identifier_1,
256 &identifier_1_size));
242 FileID::ConvertIdentifierToString(identifier_1, identifier_string_1, 257 FileID::ConvertIdentifierToString(identifier_1, identifier_string_1,
243 sizeof(identifier_string_1)); 258 sizeof(identifier_string_1));
244 259
245 { 260 {
246 ELF elf2(EM_386, TypeParam::kClass, kLittleEndian); 261 ELF elf2(EM_386, TypeParam::kClass, kLittleEndian);
247 Section text_2(kLittleEndian); 262 Section text_2(kLittleEndian);
248 Section foo_2(kLittleEndian); 263 Section foo_2(kLittleEndian);
249 PopulateSection(&foo_2, 32, 5); 264 PopulateSection(&foo_2, 32, 5);
250 elf2.AddSection(".foo", foo_2, SHT_PROGBITS); 265 elf2.AddSection(".foo", foo_2, SHT_PROGBITS);
251 PopulateSection(&text_2, 4096, 31); 266 PopulateSection(&text_2, 4096, 31);
252 elf2.AddSection(".text", text_2, SHT_PROGBITS); 267 elf2.AddSection(".text", text_2, SHT_PROGBITS);
253 elf2.Finish(); 268 elf2.Finish();
254 this->GetElfContents(elf2); 269 this->GetElfContents(elf2);
255 } 270 }
256 271
257 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, 272 EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
258 identifier_2)); 273 identifier_2,
274 &identifier_2_size));
259 FileID::ConvertIdentifierToString(identifier_2, identifier_string_2, 275 FileID::ConvertIdentifierToString(identifier_2, identifier_string_2,
260 sizeof(identifier_string_2)); 276 sizeof(identifier_string_2));
261 277
262 EXPECT_STRNE(identifier_string_1, identifier_string_2); 278 EXPECT_STRNE(identifier_string_1, identifier_string_2);
263 } 279 }
OLDNEW
« src/common/linux/file_id.h ('K') | « src/common/linux/file_id.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698